什么是正则表达式: 通俗来说,就是定义了一种匹配字符串的规则. 然后就可以根据这个规则,在待匹配的字符集中找到满足这个匹配规则的一部分(或几部分).
常用元字符
代码/语法 | 说明 |
---|---|
. | 匹配除了换行符以外的任意单个字符 |
d | 匹配数字 |
w | 匹配字母,数字,下划线 |
s | 匹配任意空白字符( , , ,空格) |
匹配单词的边界(单词的开始或结束) | |
匹配一个换行符 | |
匹配一个制表符 | |
a|b | 匹配字符a或者b |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
反义
代码/语法 | 说明 |
---|---|
D | 匹配任意非数字的字符 |
W | 匹配任意不是字母,数字,下划线的字符 |
S | 匹配任意非空白字符 |
B | 匹配非单词边界 |
字符转义
如果想匹配元字符本身(.
, w
等), 这时就需要在元字符前使用(反斜杠)来取消字符的特殊含义. 例如,使用., *, 来匹配.,*,
本身.
匹配次数
代码/语法 | 说明 |
---|---|
? | 重复零次或一次 |
+ | 重复零次或任意多次 |
* | 重复零次或任意多次 |
{m} | 重复m次 |
{m,} | 重复m次或更多次 |
{m, n} | 重复m到n次 |
字符组
代码/语法 | 说明 |
---|---|
[xyz] | 匹配字符集中的任意一个字符(字符集中字符可以是任意类型) |
[^xyz] | 匹配非字符集中的任意一个字符 |
[a-z] | 可以指定范围, [a-z]表示匹配任意一个小写的英文字母 |
[^a-z] | 匹配任意一个非小写英文字母的字符 |
[0-9] | 匹配任意一个数字,等同于d |
[^0-9] | 匹配任意非数字 |
[0-9a-zA-Z_] | 等同于w |
分组
重复单个字符,直接在字符后面加上限定符就可以; 但如果想要重复多个字符,该如何处理? 可以使用小括号来指定子表达式(也叫做分组),然后就可以指定这个子表达式的重复次数.
贪婪匹配与懒惰匹配
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧:
a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。
代码/语法 | |
---|---|
?? | 重复零次或一次,但尽可能少的重复 |
+? | 重复一次或更多次,但尽可能少的重复 |
*? | 重复任意次,但尽可能少的重复 |
{m, n}? | 重复m到n次,但尽可能少的重复 |
{m,}? | 重复m次以上,但尽可能少的重复 |