正则表达式必知必会
1、匹配任意字符
.可以匹配除换行符以外的任意一个字符,如想要匹配.必须使用\进行转义,即\.
2、匹配指定字符
将需要匹配的字符放在[ ]中,这样一个字符集合中的任意字符都可以被匹配
3、匹配字符区间
把需要匹配的字符区间放在[ ]中,比如0-9,a-z,即可匹配在字符区间内的每个字符
字符区间的首、尾字母可以是ASCⅡ字符表里的任意字符
4、连字符-
这是一个特殊的元字符,作为元字符它只能用在[和]之间,在字符集合以外的地方,只是一个普通字符,只能和-本身相匹配,在正则表达式中,-字符不需要被转义
5、取非匹配
除了那个字符集合里的字符,其他字符都可以匹配,例如[^0-9]用来匹配非数字
6、匹配空白字符
空白元字符表
元字符 | 说明 |
\f | 换页符 |
\n | 换行符 |
\r | 回车符 |
\t | 制表符 |
\v | 垂直制表符 |
\r\n是Windows所使用的文本行结束标签,Unix和Linux系统只使用一个换行符来结束一个文本行
7、匹配特定的字符类别
\d 匹配任何一个数字字符(等价于[0-9])
\D 匹配任何一个非数字字符(等价于[^0-9])
\w 匹配任何一个字符数字字符或下划线字符(等价于[a-zA-Z0-9])
\W 匹配一个非字母数字或下划线字符(等价于[^a-zA-Z0-9])
\s 匹配任何一个空白字符(等价于[\f\n\r\t\v])
\S 匹配任何一个非空白字符(等价于[^\f\n\r\t\v])
\x 匹配一个十六进制数值
\0 匹配一个八进制数值
8、匹配一个或多个字符
+匹配一次重复或多次重复的字符/字符集合(至少一次,不匹配零次的情况)
在给一个集合使用+后缀时,必须放在集合的外面,比如[0-9]+,而[0-9+]代表的是一个由数字和+组成的字符集合
9、匹配零个或多个字符
*匹配零次重复或多次重复的字符/字符集合
10、匹配零个或一个字符
?匹配零次重复或者一次重复,最多不超过一次重复
11、重复匹配次数
把重复匹配的次数写在{和}中,可以是一个精确的值,比如{3},只有三次重复才算匹配成功,即使两次重复都不算成功匹配
而{2,4}则是设定一个重复匹配的区间为2次到4次
{4, }则是设定最少重复次数为4次,上不封顶
12、过度匹配
*和+都是贪婪型元字符,在进行匹配时的行为模式是多多益善,而不是适可而止
为了防止过度匹配,可以使用贪婪型元字符的懒惰版本
* *?
+ +?
{n,} {n,}?
13、位置匹配
用限定符\b来匹配一个单词的开始和结尾
\b匹配的是这样的一个位置,这个位置位于一个能够用来构成单词的字符(字母、数字、下划线)和 不能用来构成单词的字符之间
\b匹配且只匹配一个位置,不匹配任何字符,用\bcat\b匹配到的字符串长度是3个字符,而非5个字符
14、字符串边界
^定义了字符串开头位置,例如^\s*将匹配一个字符串的开头位置和随后的零个或多个空白字符
$定义了字符串结尾位置,例如\s*$将匹配一个字符串结尾的零个或多个空白字符
15、分行匹配模式
分行匹配模式使得正则表达式引擎把行分隔符当作一个字符串分隔符来对待
(?m)必须放在整个模式的最前面
16、子表达式
子表达式必须用(和)括起来
(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}用来匹配合法的IP地址
 =non-breakingspace
17、回溯引用
回溯引用指的是模式的后半部分引用在前半部分中定义的子表达式
用\1来代表模式中第一个子表达式
用子表达式把整个模式的一部分单独划分出来以便在后面引用
不同的正则表达式实现在回溯引用上有很大差异
回溯引用通常从1开始计数,第0个匹配可以用来代表整个正则表达式
在对文本进行重新排版时,把文本分解成多个子表达式往往非常有用
.NET支持命名捕获功能
18、大小写转换
\E | 结束\L或\U转换 |
\l | 把下一个字符转换为小写 |
\L | 把\L到\E之间的字符全部转换为小写 |
\u | 把下一个字符转换为大写 |
\U | 把\U或\E之间的字符全部转换为大写 |
19、前后查找
常见的正则表达式都支持向前查找,支持向后查找的就不多了,比如Java、PHP、Perl、.NET
向前查找就是一个以?=开头的子表达式,匹配的文本跟在=后面
.+(?=:)
在同一个搜索模式里可以使用多个向前查找表达式,它们可以出现在模式里的任意位置
向后查找操作符为?<=
对前后查找取非:
(?=) | 正向前查找 |
(?!) | 负向前查找 |
(?<=) | 正向后查找 |
(?<!) | 负向后查找 |
20、查找条件
正则表达式中的条件要用?来定义
(?(backreference)true-regex)中?表明这是一个条件,括号里的backreference是一个回溯引用,true-regex是一个只在backreference存在时才会被执行的子表达式
(?(backreference)true-regex|false-regex),这个语法接受一个条件和两个将分别在这个条件得到满足和没有得到满足时执行的子表达式
前后查找条件只在一个向前查找或向后查找操作取得成功的情况下才允许一个表达式被使用。定义一个前后查找条件的语法与定义一个回溯引用条件的语法大同小异。只需要把回溯引用(括号里的回溯引用编号)替换为一个完整的前后查找表达式就行了。