分类:
2007-12-21 16:59:08
1. 正则表达式是什么
在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。简单说:正则表达式是用于进行文本匹配的工具。
2. 元字符(metacharacter)
\b 是代表着单词的开头或结尾,也就是单词的分界处。\b 匹配这样的位置:它的前一个字符和后一个字符不全是(一个是,一个不是或不存在)\w
. 匹配除了换行符以外的任意字符
\d 匹配任意的数字(0~9)
\s 匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等
\w 匹配字母或数字或下划线或汉字等
^ 匹配要用来查找的字符串的开头,除非 ^ 在方括号表达式中使用,此时它表示不接受该字符集合
$ 匹配输入字符串的结尾位置
3. 如果你想查找元字符本身的话,就要使用转义字符\
4. 限定符
* 它代表的不是字符,也不是位置,而是数量——它指定*前边的内容可以连续重复出现任意次以使整个表达式得到匹配,可能是0次
+ 匹配重复1次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
5. 匹配没有预定义元字符的字符集合
只需要在中括号里列出它们就行了:
[aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!)(英文语句通常只以这三个标点结束)
也可以轻松地指定一个字符范围,像[0-9]代表的含意与\d就是完全一致的:一位数字,同理[a-z0-9A-Z_]也完全等同于\w(如果只考虑英文的话)
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符
7. 正则表达式里的替换指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用 | 把不同的规则分隔开
使用替换时,顺序是很重要的。原因是匹配替换时,将会从左到右地测试每个分枝条件,如果满足了某个分枝的话,就不会去管其它的替换条件了
8. 子表达式
用()括起来就是一个字表达式,用法上与单个字符没有区别
9. 后向引用
使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推;
后向引用用于重复搜索前面某个分组匹配的文本。例如,\1代表分组1匹配的文本;
也可以自己指定子表达式的组名。要指定一个子表达式的组名,请使用这样的语法:(?
10. ()的其他用处
捕获:
(exp) 匹配exp,并捕获文本到自动命名的组里
(?
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
11. 零宽断言 与 负向零宽断言
用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(断言),因此它们也被称为零宽断言
(?=exp) 匹配exp前面的位置 。也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp
(?<=exp) 匹配exp后面的位置 。也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp
(?!exp) 匹配后面跟的不是exp的位置 。零宽度负预测先行断言。断言此位置的后面不能匹配表达式exp
(?
12. 注释
(?#comment) 这种类型的组不对正则表达式的处理产生任何影响,用于提供注释让人阅读。要包含注释的话,最好是启用“忽略模式里的空白符”选项,这样在编写表达式时能任意的添加空格,Tab,换行,而实际使用时这些都将被忽略。启用这个选项后,在#后面到这一行结束的所有文本都将被当成注释忽略掉。
13. 懒惰限定符
匹配尽可能少的字符。只要在它后面加上一个问号?
这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。
正则表达式有另一条规则,比懒惰/贪婪规则的优先级更高:最先开始的匹配最有最大的优先权——The Match That Begins Earliest Wins。
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
14. 非打印字符
\cx 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符
\f 匹配一个换页符。等价于 \x0c 和 \cL
\n 匹配一个换行符。等价于 \x0a 和 \cJ
\r 匹配一个回车符。等价于 \x0d 和 \cM
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]
\t 匹配一个制表符。等价于 \x09 和 \cI
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK
15. 各种操作符的运算优先级
相同优先级的从左到右进行运算,不同优先级的运算先高后低。各种操作符的优先级从高到低如下:
操作符 |
描述 |
\ | 转义符 |
(), (?:), (?=), [] | 圆括号和方括号 |
*, +, ?, {n}, {n,}, {n,m} | 限定符 |
^, $, \anymetacharacter | 位置和顺序 |
| | “或”操作 |