正则表达式

正则表达式普通规则

 

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+"

posted on 2010-11-25 21:54  五月十七  阅读(180)  评论(0)    收藏  举报

导航