标签:难题 转换 ... system 单个字符 多次 reg body 函数
正则表达式 | |
1、 元字符 | |
元字符是正则表达式的基础,比如\d--[0-9]数字字符,\D--[^0-9]非数字字符;还有转义符\f--换页,\n--换行;边界^--字符串起始位置,$--字符串结束位置,量词*--重复零次或更多 x>=0,+--重复一次或更多次 x>=1,?--重复零次或一次 x=(0||1) | |
{n}n次x=n,{n,} 重复n次或更多 x>=n,{n,m} 重复出现的次数比n多但比m少 n<=x<=m | |
2、正则方法 | |
-> test | |
语法: <regexp>.test( string ) -> boolean | |
判断这个字符串是否符合这个正则表达式 | |
常用与验证 | |
-> exec | |
语法: <regexp>.exec( string ) -> Array | |
将匹配到的提取出来. | |
1> 单个字符串提取 | |
/e/.exec( ‘abcdefg‘ ) -> [ ‘e‘ ] | |
/h/.exec( ‘abcdefg‘ ) -> null | |
2> 提取并解析( 常用 ) | |
分组: 在 正则表达式中使用 () 可以将匹配的结果进行分组. | |
学会分组的编号. | |
1) 从左往右数 左圆括号 ( | |
2) 依次从 1 开始给 圆括号编号 | |
123 4 5 6 | |
/(((.)(.))(.)(.))/ | |
使用 exec 方法返回的是一个数组. 在匹配的结果中, 匹配到的字符串是数组的 第 0 个元素. | |
其中的每一组对应于数组的每一项. | |
var r = /(((.)(.))(.)(.))/; | |
var str = ‘abcd‘; | |
r.exec( str ); | |
// [ 0 ]: 匹配到的结果: ‘abcd‘ | |
// [ 1 ]: 匹配到的第1组: ‘abcd‘ | |
// [ 2 ]: 匹配到的第2组: ‘ab‘ | |
// [ 3 ]: 匹配到的第3组: ‘a‘ | |
// ... | |
Array[7]={0: "abcd",1: "abcd",2: "ab",3: "a",4: "b",5: "c",6: "d"} | |
对路径的解析: | |
/.:.*\\.+\..+/ | |
例如: c:\windows\system32\1.mp3 | |
.代表任意字符(C盘) : 对应盘符冒号 .*0次或多次 尽量多的匹配(贪婪模式) 所以从后面开始看 | |
.+1次或多次 再往前\.转移字符.对应.mp3的"." 所以最后的.+对应mp3 | |
再往前.+ 1次或多次 再往前\\转移字符\ 对应\1.mp3的"\",所以 .+对应1 | |
最后中间的\windows\system32都属于.* | |
// 贪婪模式, 所有 +, * 这类元字符都是尽可能多匹配 | |
/(.+)(.+)(.+)/ | |
/(.+)(.+)(.+)/.exec(‘abcdef‘)结果是 | |
Array[4]={0: "abcdef",1: "abcd",2: "e",3: "f"} | |
/(.+)(.+)(.+)/.exec(‘abcdef‘)[1]----"abcd" | |
// 取消贪婪使用 ? | |
/(.+?)(.+)(.+)/ | |
/(.+?)(.+)(.+)/.exec(‘abcdef‘)结果是 | |
Array[4]={0: "abcdef",1: "a",2: "bcde",3: "f"} | |
/(.+)(.+)(.+)/.exec(‘abcdef‘)[1]----"a" | |
3> 循环提取所有 | |
‘abcdefgedgedg‘ // 将其中所有的 e 取出来 | |
操作: | |
1) 在正则表达式中启用全局模式: /..../g, new RegExp( ‘...‘, ‘g‘ ) | |
2) 调用一次 exec 方法, 获取一个匹配项 | |
3) 再次调用 exec 方法, 获得下一个匹配项 | |
4) 如此往复, 没有匹配项的是否返回 null, 再次调用 exec 则匹配返回第一个匹配项 | |
var m; | |
while ( ( m = r.exec( str ) ) != null ) { | |
// m 就是每一次匹配到的结果 | |
} | |
-> replace | |
找出匹配项替换掉 | |
a、简单的替换: | |
‘adCde‘.replace(/[A-Z]/g,-)------"ad-de" | |
b、带回调函数的替换 | |
‘abCdeFg‘.replace(/[A-Z]/g,function(str){return str.toLowerCase()})----"abcdefg" | |
在这里也可以用分组的思想解决部分难题:比如将‘abc-def-ghi-jk‘转换为‘abcDefGhiJk‘; | |
我们需要去掉‘-‘还需要将之后的第一个字母变为大写;那我们可以这样 | |
‘abc-def-ghi-jk‘.replace(/-(.)/g,function(_,num1){return num1.toUpperCase()})---"abcDefGhiJk" | |
这里参数和上面exec方法中的分组一样,"_"代表匹配的结果(由于不需要所有给_),num1代表匹配到第一组,而且里面只有一个组(.)横线后的任意字母,返回值将字母转换为大写即可; | |
再看看,如果同样的字符串我们需要把横线后第二个字母改为下划线"_",我们可以这样 | |
‘abc-def-ghi-jk‘.replace(/(-.)(.)/g,‘$1_‘)----"abc-d_f-g_i-j_" | |
在这里有需要注意的"$1"表示匹配到的第一个组,"$2"表示匹配到的第二个组; | |
https://github.com/zxx2011509281/RegExp-.git | |
标签:难题 转换 ... system 单个字符 多次 reg body 函数
原文地址:http://www.cnblogs.com/H5C3JS/p/6666639.html