正则表达式在线测试平台

地址:https://regex101.com/

正则表达式的语法

| 代码 | 说明 |
| ———— | ————————————————————————————————————————– | ————————————————————————— | —————————– |
| . | 匹配除了换行符以外的任意字符 |
| \d | 匹配任意的一个数字。如果连续匹配多个数字的话,也可以写成 |
| \s | 匹配任意的空白符。包括空格,制表符(Tab),换行符,中文全角空格 |
| \w | 匹配单词、数字、下划线、汉字;如果只考虑英文,\w 等同于 [a-z0-9A-Z_] |
| \ | 转义字符,将下一个字符标记为或特殊字符、或原义字符、或后向引用、或八进制转义符
例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符 |
| | | 指明两项之间的一个选择。满足其中任意一种规则都应该当成匹配
具体方法是用|把不同的规则分隔开,即逻辑或 |
| { | 标记限定符表达式的开始,比如重复 n 次:{n} |
| [ | 标记一个中括号表达式的开始 |
| () | 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用,比如后向引用 |
| | |
| 位置匹配 | 位置匹配 |
| \b | 只匹配一个位置。它本身不匹配任何字符,代表着单词的开头或结尾,也就是单词的分界处 |
| ^ | 匹配字符串的开始 |
| $ | 匹配字符串的结束 |
| | |
| 重复匹配 | 常用的限定符 |
| * | * 前边的内容可以连续重复零次或更多次 |
| + | 重复一次或更多次 |
| ? | 重复零次或一次 |
| {n} | 重复 n 次,比如 \d{2} ,意思是前面 \d 必须连续重复匹配 2 次 |
| {n,} | 重复 n 次或更多次 |
| {n,m} | 重复 n 到 m 次 |
| | |
| 反义匹配 | 除了什么之外 |
| \W | 匹配任意不是字母,数字,下划线,汉字的字符 |
| \S | 匹配任意不是空白符的字符 |
| \D | 匹配任意非数字的字符 |
| \B | 匹配不是单词开头或结束的位置 |
| [^x] | 匹配除了 x 以外的任意字符 |

分组

如果需要重复单个字符,可以直接在字符后面加上限定符;如

1
\d{1,3}

但如果想要重复多个字符,就需要分组了。用小括号来指定子表达式(也叫做分组),然后就可以指定这个子表达式的重复次数了

1
(\d{1,3}\.){3}\d{1,3}

上面这个表达式就是将 (\d{1,3}\.) 这个子表达式(分组)重复 3 次,最后接一个 1 到 3 位的数字

分组语法说明
捕获
(exp)匹配 exp,并捕获文本到自动命名的组里
(?<name>exp)匹配 exp,并捕获文本到名称为 name 的组里
(?'name'exp)匹配 exp,并捕获文本到名称为 name 的组里,等同于(?<name>exp)
(?:exp)匹配 exp,不捕获匹配的文本,也不给此分组分配组号

后向引用

使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为 1,第二个为 2,以此类推。

后向引用用于重复搜索前面某个分组匹配的文本。例如,\1 代表分组 1 匹配的文本。

1
\b(\w+)\b\s+\1\b

上面的表达式用于匹配连续重复出现 2 次的单词,比如 go where? go go ,组名为 1,捕获到的内容为 go go

也自己指定子表达式的组名,如果自己指定了一个子表达式的组名,要反向引用分组捕获的内容,使用

1
\k<自己指定的组名>

比如说对上面的分组换一个写法

1
\b(?<name1>\w+)\b\s+\k<name1>\b

零宽断言

零宽断言用于指定一个位置,类似于 \b$ 这样的位置匹配

但是区别在于这个位置需要满足一定的条件,也就被称作零宽断言

语法说明
(?=exp)零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式 exp
(?<=exp)零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式 exp
(?!exp)零宽度负预测先行断言,它断言自身出现的位置的后面不能匹配表达式 exp
(?<!exp)零宽度正回顾后发断言,它断言自身出现的位置的前面不能匹配表达式 exp

比如(?=exp)

1
\b\w+(?=ing\b)

匹配内容:I'm singing while you're dancing.

匹配到的结果是 singdanc(也就是匹配到了以 ing 作为后缀的单词的前面内容)

(?=ing\b) 出现的位置:sing ingdanc ing

注释

使用#进行注释说明,不对正则表达式的处理产生任何影响,用于提供注释让人阅读

比如说:我们可以前面的一个表达式写成这样(注意需要开启忽略空白字符)

1
2
3
4
\b\w+    #查找的内容
(?= #断言要匹配的文本的后缀
ing\b #要匹配的内容
) #后缀结束

贪婪匹配与懒惰匹配

正则表达式通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。

比如这个表达式:a.*b,它将会匹配最长的以 a 开始,以 b 结束的字符串。如果用它来搜索 aabab 的话,它会匹配整个字符串 aabab,这被称为贪婪匹配。

懒惰匹配,也就是匹配尽可能少的字符。在能使整个匹配成功的前提下使用最少的重复,只要在它后面加上一个问号?即可。比如说 a.*?b 匹配最短的,以 a 开始,以 b 结束的字符串。如果把它应用于 aabab 的话,它会匹配 aab(第一到第三个字符)和 ab(第四到第五个字符)

为什么第一个匹配是 aab(第一到第三个字符)而不是 ab(第二到第三个字符)?简单地说,因为正则表达式有一条比懒惰贪婪规则优先级更高的规则,就是:最先开始的匹配拥有最高的优先权

贪婪限定符说明
*?重复任意次,但尽可能少重复
+?重复 1 次或更多次,但尽可能少重复
??重复 0 次或 1 次,但尽可能少重复
{n,m}?重复 n 到 m 次,但尽可能少重复
{n,}?重复 n 次以上,但尽可能少重复