正则表达式学习笔记
推荐教程:learn-regex/README-cn.md at master · ziishaned/learn-regex (github.com)
限定符
? 限定符
?
限定符会匹配?
前字符0次或1次,
例如:/used?/g
会匹配以下字符串:
use
used
* 限定符
*
限定符会匹配*
前字符0次或多次
例如:/ab*c/g
会匹配如下:
ac
abc
abbbbbbbbc
+ 限定符
+
限定符会匹配前字符1次或多次
例如:/ab+c/g
会匹配如下:
abc
abbbbbc
{} 限定符
{}
限定符可以指定其前字符匹配次数。
可以单个数字表示匹配次数,例如:/ab{5}c/g
:
abbbbbc
也可以使用区间,用法类似于Python列表切片,例如:
/ab{2,5}c/g
或者/ab{2,}c/g
会匹配如下:
abbc
abbbc
abbbbc
abbbbbc
() 多字符匹配
使用()
将匹配的对象包括起来,再使用限定符即可实现多字符匹配,例如:
/(ab)?c/g
:
abc
c
| 或运算
|
或运算符会匹配两个条件或字符串中的任意一个,例如:
/a (dog|cat)/g
:
a dog
a cat
注意,其中起到视为整体的()
不可省略,如果省去则匹配结果为:
a dog
cat
字符类
[]
[]
表示匹配的对象只能取之于[]
内,例如:
/[abc]+/g
:
abc
aabbcc
a
b
c
同时可以使用-
来省略一个既定顺序中间部分(例如字母表a到z),因此上面例子统一可以写为:/[a-c]+/g
在[]
中前加^
表示取反,即匹配不存在于[]
中的字符,例如
/[^0-9]+/g
会匹配所有除数字外的所有字符,包括换行符等
特殊符号
. 匹配所有字符
.
会匹配所有字符,包括空格,但不包括换行符
^ 匹配行首
注意,此非[]
中的取反
^
会匹配后以后面字符开头的字符串,例如/^a/g
只会匹配
abc
bca
bba
中的
abc
$ 匹配行尾
与^
匹配同理,例如/a$/g
只会匹配
abc
bca
bba
中的
bca
bba
预设元字符
-
\d
匹配数字字符 -
\D
匹配非数字字符 -
\w
匹配单词字符(英文、数字、下划线) -
\W
匹配非单词字符 -
\s
匹配空白字符(包括换行符,Tab) -
\S
匹配非空白字符 -
\b
标注字符的边界,例如/\bab\b/g
只会匹配abc ab
中的
ab
贪婪与非贪婪
正则表达式的贪婪匹配和懒惰匹配 - 知乎 (zhihu.com)
- 贪婪匹配
正则表达式通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。比如这个表达式:a.*b
,它将会匹配最长的以a
开始,以b
结束的字符串。如果用它来搜索aabab
的话,它会匹配整个字符串aabab
,这被称为贪婪匹配。
- 懒惰匹配
懒惰匹配,也就是匹配尽可能少的字符。在能使整个匹配成功的前提下使用最少的重复,只要在它后面加上一个问号?
即可。现在看看懒惰版的例子吧:
a.*?b
匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab
的话,它会匹配aab
(第一到第三个字符)和ab
(第四到第五个字符)
为什么第一个匹配是aab
(第一到第三个字符)而不是ab
(第二到第三个字符)?
简单地说,因为正则表达式有一条比懒惰/贪婪规则优先级更高的规则,就是:最先开始的匹配拥有最高的优先权