正则表达式
正则表达式普通规则
1.与多种字符匹配的表达式
\d 匹配任意一个数字
\w 匹配任意一个数字,字母或下划线
\s 匹配空格,制表符,换页符等空白字符中的一个
. 匹配除换行符外的任意一个字符
2.自定义匹配"多种字符"表达式
[] 匹配括号中的任一个字符
[^] 匹配除括号中的任一个字符
例子: [A-F0-3],匹配字符 A-F , 0-3
[^abc],除a,b,c外的任何一个字符
3.修饰匹配次数的特殊符号
{n} 表达式重复 n 次
{m,n} 表达式重复最少 m 次,最多 n 次
{m,} 表达式至少重复 m 次
? 匹配表达式 0 次 或 1 次,相当于{0,1}
+ 匹配表达式至少 1 次, 相当于{1,}
* 表达式不出现或出现任意次,相当于{0,}
注意:以上修饰符,只修饰一个字符
4.其他一些代表抽象意义的特殊符号
^ 与字符串开始的地方相匹配,不匹配任何字符
$ 与字符串结束的地方相匹配,不匹配任何字符
\b 匹配一个单词边界,不匹配任何字符
注意:\b 要求在匹配中所处位置的左右两边,其中一边为 \w ,另一边为非\w的范围
| 左右两边表达式之间"或"关系,匹配左边或右边
注意:与 [] 不同,[] 匹配括号中的任一个字符,而 | 匹配其左或右的字符集,如 [mb]ab|cd ,在匹配字符串 "mabcd" 是成功的,匹配到字符为 "mab","cd"
() 1).在被修饰匹配次数时,括号内的表达式作为整体被修饰
2).取匹配结果时,括号中表达式匹配到的内容可单独渠道
注意: () 的第二个功能如: ¥(\d+\.?\d*) 在匹配 "$10.5,¥20.5" 时,匹配结果为, "¥20.5", () 取值为 "20.5"
若想匹配字符 "$","^","." 等,需用 /$ , /^ , /.
正则表达式高级规则
1.匹配次数的"贪婪"与"非贪婪"模式
"贪婪"模式
所谓的贪婪模式,即使用匹配次数修饰符,在匹配时总尽可能得多的匹配.
针对字符串 "dxxxdxxxd" 有如下表达式
d(\w+)d 匹配到的字符串: "dxxxdxxxd" ,括号值为: "xxxdxxx"
说明:(\w+)尽可能的匹配多的字符,在上式中,虽然他可匹配最后一个 "d" ,但为使整个表达式成功, "\w+" 可以"让出"它所能匹配的最后一个 "d" ,即,可得出:贪婪模式为,在尽可能保证表达式匹配成功的前提下, 次数修饰符 将尽可能多的进行匹配
"非贪婪"模式
在修饰匹配次数的特殊符号后,再加上一个 "?" 号,则可以使匹配次数不定的表达式尽可能少的匹配,该模式也称为 "勉强"模式
针对字符串 "dxxxdxxxd" 有如下表达式
d(\w+?) 匹配到的字符串为 : "dx" ,括号值为: "x"
d(\w+?)d 匹配到的字符串为: "dxxxd" ,括号值为: "xxx"
说明:可见,非贪婪模式为,在尽可能保证表达式匹配成功的前提下,次数修饰符 将尽可能少的进行匹配
例子:表达式 "<td>(.*)</td>" 与字符串 "<td><b>test1</b></td><td><b>test2</b></td>" 匹配,结果为整个字符串.
表达式 "<td>(.*?)</td>" 与字符串 "<td><b>test1</b></td><td><b>test2</b></td>" 匹配.将只得到 "<td><b>test1</b></td>"
2.反向引用
小括号匹配到的字符串,不仅在匹配后才可以使用,在匹配的过程中也可以.使用的方法是,"\"加上数字,"\1"表示引用第一对括号匹配到的内容,如此类推,若括号中包含括号,则外层的括号先排序.
例子:表达式 "(\w)\1{4,}" 在字符串 "aa bbbb abcdefg ccccc" 的匹配中,匹配结果成功,匹配到的字符串为: "ccccc" ,注意与 "\w{5,}" 的区别
3.预搜索与反向预搜索
预搜索: "(?=xxxx)","(?!xxxx)"
"(?=xxxx)",在被匹配的字符串中,它对所处的"缝隙"或"两头"附加的条件是:在"缝隙"的右边,需要能够匹配得上 "xxxx" 这部分的内容(这里的"xxxx"代表某匹配符等),但"(?=xxxx)"只是作为一个搜索的条件,并没有真正意义上的匹配,不影响该表达式后边的表达式去真正的匹配
例子1: "Windows (?=XP|NT)" 在匹配 "Windows 98,Windows NT" 时,将只匹配到 "Windows NT" 中的 "Windows "
可以看出,它仅作为条件去搜索符合表达式 "Windows (?=XP|NT)" 的字符串,在找到符合条件的字符串后, "(?=XP|NT)" 并没有做真正的匹配
例子2: "(\w)((?=\1\1\1)(\1))+" 在匹配 "aaa ffffff 999999999"时,匹配到的值为: "ffffff" 中的前4个 "f" , "999999999" 中的前7个 "9"
可以看出,先匹配(\w),再搜索符合(?=\1\1\1)的匹配,也就是得3个和(\w)一样的字符,但它并不做任何匹配,若找到,则(\1)匹配一个(\w)的值,然后重复(贪婪模式)
反向预搜索: "(?<=xxxx)","(?<!xxxx)"
如同预搜索,但是对所处的"缝隙"的左边附加上条件
4.其他
1).普通规则中的第一点,里面的 "/b" , "/w" , "/s" 若大写,则匹配的内容与之相反,如 "/W" 为:匹配数字,字符与下划线之外的任意一个字符.
2).表达式尽量不要写成能匹配空字符串,否则会一直匹配成功,而结果却什么都没匹配到,如有字符串 "123 123. 123.4 .4" 不能写成 "\d*\.?\d*" 因为如果匹配的字符串中什么都没有,它也是匹配成功的.更好的写法因为 "\d+\.?\d+|\.\d+"
浙公网安备 33010602011771号