正则表达式
字符
匹配某个确定的字符
转义字符
用\来设置或取消某个字符的特殊意义
字符组
分类
[ae] 匹配a、e中的某个字符
[^ae] 匹配非a、e的某个字符
简记法
. 匹配非回车符、换行符的任意字符
\w 匹配字母、数字、下划线
\W 匹配非\w的字符
\s 匹配任意的空白符(空格、制表符、回车符、换行符)
\S 匹配非\s字符
\d 匹配数字(0-9)
\D 匹配非\d字符
锚点
^ 匹配一行的开始位置
$ 匹配一行的结束位置
\A 匹配字符串的开始位置
\Z 匹配字符串的结束位置
\b 单词分界符,即该位置一侧是\w,另一侧是\W,匹配单词的起始位置、结束位置
\B 匹配非单词的起始位置、结束位置
重复
? 重复零次或一次
+ 重复一次或更多次
* 重复零次或更多次
{n,m} 重复n到m次
{n} 重复n次
{n,} 重复n次或更多次
贪婪匹配和懒惰匹配
贪婪匹配
用a.b来搜索aabab,会匹配整个字符串aabab。这被称为贪婪匹配
懒惰匹配
用a.?b来搜索aabab,会匹配aab(第一到第三个字符)和ab(第四到第五个字符)
为什么第一个匹配是aab(第一到第三个字符)而不是ab(第二到第三个字符)?
因为正则表达式有另一条规则,比懒惰/贪婪规则的优先级更高:最早匹配优先。
懒惰限定符
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
分枝条件
用|区隔多个规则
自左到右测试每个分支条件,若匹配某个分枝则忽略其它条件
常用分组语法
捕获分组
(exp) 匹配exp,并捕获文本到自动命名的分组里
(?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
注意
只要使用了括号,就存在捕获分组
自左向右,以左括号为标志,第一个分组的组号为1,第二个为2,以此类推
若捕获分组后存在量词,则捕获分组保存的是子表达式最后一次匹配的字符串
环视
用子表达式对位置进行判断
分类
正向肯定环视 (?=exp) 匹配exp前的位置,即匹配内容后要有exp
正向否定环视 (?!exp) 匹配非exp前的位置,即匹配内容后不能有exp
反向肯定环视 (?<=exp) 匹配exp后的位置,即匹配内容前要有exp
反向否定环视 (?<!exp) 匹配非exp后的位置,即匹配内容前不能有exp
注意
环视结构仅用于布尔判断,结构内子表达式所匹配的文本,不会保存在整个表达式的匹配结果中
在某些编程语言中,反向环视对子表达式存在限制
注释
(?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读
后向引用
用\转义的数字
用于重复搜索前面某个分组匹配的文本
匹配模式
分类
I:Case Insensitive,不区分大小写模式
S:SingleLine,单行模式,点号(.)可以匹配所有字符,包括回车符、换行符
M:MultiLine,多行模式,^和$可以匹配字符串内各行文本的起始位置、结束位置
X:Comment,注释模式,在正则表达式内部可以使用注释
注意
\A和\Z不受影响
模式的混合
作用:同时使用多个模式
形式:在编译正则表达式时,把表示模式的多个参数用|连接起来
模式的作用范围
作用:精确控制各个模式的作用范围
形式:在表达式中,以(?ismx)的方式启用模式,以(?-ismx)的方式停用模式