1.特殊字符
: 单词的开头和结尾,也就是单词的分界处。匹配一个位置。
^ :匹配字符串的开始。有些正则表达式处理工具还有一个处理多行的选项。如果选中了这个选项,^和$的意义就变成了匹配行的开始处和结束处。
$ :匹配字符串的结束
. :匹配除了换行符以外的任意字符。
* :*前边的内容可以连续重复使用任意次以使整个表达式得到匹配(可以是0次)。
+ :+前面的内容可以连续重复使用1次或者多次。
? :重复0次或一次
{n}:重复n此
{n,}:重复n次或更多次
{n,m}:重复n次到m次
d :匹配一位数字(0,1,2...)
- :只匹配它本身
s :匹配任意的空白符,包括空格,制表符(tab),换行符,中文全角空格等。
w :匹配字母或数字或下划线或汉字等。
:如果查找特殊字符本身,前面加上
你想匹配没有预定义元字符的字符集合,你只需要在方括号里列出它们就行了,像[aeiou]就匹配任何一个英文元音字母
[.?!]匹配标点符号(.或?或!)
一个字符范围,像[0-9]代表的含意与d就是完全一致的:一位数字
2.分枝条件
是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开。
d{5}-d{4}|d{5}这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字,或者用连字号间隔的9位数字。之所以要给出这个例子是因为它能说明一个问题:使用分枝条件时,要注意各个条件的顺序。如果你把它改成d{5}|d{5}-d{4}的话,那么就只会匹配5位的邮编(以及9位邮编的前5位)。原因是匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。
3.分组
重复多个字符,用小括号来指定子表达式(也叫做分组)
例子:(d{1,3}.){3}d{1,3}是一个简单的IP地址匹配表达式。要理解这个表达式,请按下列顺序分析它:d{1,3}匹配1到3位的数字,(d{1,3}.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(d{1,3})。
4.反义
W(大写):匹配任意不是字母,数字,下划线,汉字的字符
S(大写):匹配任意不是空白符的字符
D:匹配任意非数字的字符
B:匹配不是单词开头或结束的位置
[^x]:匹配除了x以外的任意字符
[^aeiou]:匹配除了aeiou这几个字母以外的任意字符
例子:S+匹配不包含空白符的字符串。
<a[^>]+>匹配用尖括号括起来的以a开头的字符串
5.后向引用
使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。
后向引用用于重复搜索前面某个分组匹配的文本。例如,1代表分组1匹配的文本。
自定义表达式的组名:(?<Word>w+)(或者把尖括号换成'也行:(?'Word'w+)),这样就把w+的组名指定为Word了。要反向引用这个分组捕获的内容,你可以使用k<Word>,所以上一个例子也可以写成这样:(?<Word>w+)s+k<Word>。
小括号的用法:
捕获:
(exp):匹配exp,并捕获文本到自动命名的组里
(?<name>exp):匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp):匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言:
(?=exp):匹配exp前面的位置
(?<=exp):匹配exp后面的位置
(?!exp):匹配后面跟的不是exp的位置
(?<!exp):匹配前面不是exp的位置
注释:
(?#comment):这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读
6.零宽断言
接下来的四个用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言。
(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。比如w+(?=ing),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。
(?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的后面能匹配表达式exp。比如(?<=re)w+会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。
http://deerchao.net/tutorials/regex/regex.htm#grouping