记录正则表达式

元字符

符号 说明
. 匹配除换行符以外的任意字符
\w 匹配字母,数字,或下划线
\s 匹配空白字符,包括\r,\t,\n
\d 匹配数字
\b 匹配单词的开始或者结束
^ 匹配字符串的开始
$ 匹配字符串的结束

字符转义

如果要查找元字符本身,如 . ,是无法直接指定的,需要使用 \ 进行转义,例如 www.baidu\.com 匹配www.baidu.com


重复

符号 说明
* 重复零次或多次
+ 重复一次或多次
? 重复零次或一次
{n} 重复n次
{n,} 至少重复n次
{n,m} 重复n到m次

字符类

匹配没有预定义元字符的字符集合的方式,如元音字母a,e,i,o,u。只需要在方括号里列出它们就可以了,像 [aeiou] 匹配任何一个元音字母, [.?!] 匹配标点符号。也可以轻松指定一个字符范围,像 [0-9] 代表的含义与 \d 完全一致, [a-z0-9A-Z] 也完全等同于 \w (如果只考虑英文的话)。

一个更复杂的表达式: \(?0\d{2}[)-]?\d{8}

上面这个表达式可以匹配几种格式的电话号码,(010)12345678,或者010-12345678,或者01012345678等。


分枝条件

正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应当成匹配,具体方法是用 | 把不同的规则分隔开。

例子:0\d{2}-\d{8}|0\d{3}-\d{7}这个表达式能匹配两种以连字号分隔的电话号码,一种是3位区号加8位本地号,另一种是4位区号加7位本地号。

\d{5}-\d{4}|\d{5}这个例子用于说明使用分枝条件时,要注意各个条件的顺序。匹配分枝条件时,将会从左至右测试每个条件,如果满足了其中一个分枝条件,就不会去管其他的条件了。


分组

重复单个字符直接在字符后面加上限定符就可以了,若想重复多个字符,则需要用小括号来指定子表达式(也叫分组)。例子:(\d{1,3}.){3}\d{1,3}


反义

符号 说明
\W 匹配非字母,数字,下划线字符
\S 匹配非空白字符
\D 匹配非数字字符
\B 匹配非单词开头或结尾的位置
[^X] 匹配除了X以外的字符
[^aeiou] 匹配除了aeiou这几个字母以外的字符

零宽断言

断言用来声明一个应该为真的事实,正则表达式中只有当断言为真时才会继续进行匹配。

(?=exp) 也叫 零宽度正预测先行断言 ,它断言自身出现的位置后面能够匹配表达式exp。例子:

\b\w+(?=ing\b),匹配以ing结尾的单词的前部分,如查找I'm singing while you're dancing.时,它会匹配sing和danc。

(?<=exp) 也叫 零宽度正回顾后发断言 ,它断言自身出现位置的前面能匹配表达式exp。例子:

(?<=\bre)\w+\b,匹配以re开头的单词的后部分,如查找reading a book.时,它会匹配ading。


负向零宽断言

(?!exp) 零宽度负预测先行断言 ,断言此位置后面不能匹配表达式exp。例如:\d{3}(?!\d)匹配三维数字,且这三位数字后面不能是数字。

(?<!exp) 零宽度负回顾后发断言 ,断言此位置前面不能匹配表达式exp。例如: (?<![a-z])\d{7}匹配前面不是小写字母的7位数字。


注释

小括号的另一种用途是通过语法 (?#comment) 来包含注释。例如: 2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)。


贪婪与懒惰

贪婪匹配尽可能多的字符,懒惰匹配尽可能少的字符。

以aabab为例,贪婪:a.b,匹配结果为aabab,懒惰:a.\?b,匹配结果为aab和ab(为什么第一个匹配到的是aab[1-3]字符而不是ab[2-3]字符 ??? 简单的说,因为正则表达式有另外一条规则,其优先级高于贪婪/懒惰规则:最先开始的匹配拥有最高的优先权)。

符号 说明
*? 重复0次或多次,但尽可能少重复
+? 重复1次或多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n此以上,但尽可能少重复