正则表达式学习记录

一,字符匹配
1。 \b  代表着单词的开头或结尾,也就是单词的分界处。虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置。
2。 .   是另一个元字符,匹配除了换行符以外的任意字符。
3。 \n 换行符
4。 \d 匹配一个数字 【0,1,2,3.....】
5。  \w  匹配字母或数字或下划线或汉字等
6。  \s  匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等
7。  ^ 匹配字符串的开始
8。  $ 匹配字符串的结束
9。  \ 取消字符的特殊意义,当然如何查找\ 也要用\,那么就是\\
10。  []  匹配其中的任何一个字符,可以是范围,也可以是指定的特定的字符
          如果是范围使用“-”符号,否则直接指定即可
11。  |   相当于编码中的or 前后只要有一个满足条件,即可匹配成功。
12。  ()  将括号中的所有正则表达式作为一个整体

二,重复匹配数量
1。  *   同样是元字符,不过它代表的不是字符,也不是位置,而是数量——它指定*前边的内容可以连续重复使用任意次。
2。  {一个整数} 表示大括号前面的重复出现的次数
     {一个小整数,一个大整数} 重复匹配的次数,最少不能少于,最大不能大于

        例子:0\d{2}-\d{8}  以0开头,后面跟两位数字,以"-"符号连接,后面跟8个数字
3。  +   这里的+是和*类似的元字符,不同的是*匹配重复匹配任意次(可能是0次),而+则重复匹配1次或更多次
4。 ?   重复零次或一次,也就是可有可无

*
匹配前面的子表达式任意次。例如,zo*能匹配“z”,“zo”以及“zoo”,但是不匹配“bo”。*等价于{0,}。
+
匹配前面的子表达式一次或多次(大于等于1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。
?
匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等价于{0,1}。

三反义,及其他
.    常用的反义
表3.常用的反义代码 代码/语法 说明
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符
18    (?=exp)  也叫零宽度正预测先行断言
      (?<=exp) 也叫零宽度正回顾后发断言


 

 

贪婪与懒惰

当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。

有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧:

a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)ab(第四到第五个字符)

为什么第一个匹配是aab(第一到第三个字符)而不是ab(第二到第三个字符)?简单地说,因为正则表达式有另一条规则,比懒惰/贪婪规则的优先级更高:最先开始的匹配拥有最高的优先权——The match that begins earliest wins。

表5.懒惰限定符
代码/语法说明
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
posted @ 2011-11-29 10:46  SouthAurora  Views(345)  Comments(0Edit  收藏  举报