推荐教程: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(第二到第三个字符)?简单地说,因为正则表达式有一条比懒惰/贪婪规则优先级更高的规则,就是:最先开始的匹配拥有最高的优先权