本文译自:Regex tutorial — A quick cheatsheet by examples
一个测试regex的网站:https://regex101.com/
标志
regex通常包含在一对/
中,如/abc/
。在第二个/
后面可以指定标志:
- g(global):匹配成功后继续往下匹配。
- m(multi-line):
^
和$
在行内搜索,而不是整个字符串 - i(insensitive):大小写不敏感
锚定— ^ and $
^begin 匹配开始的begin字符串
end$ 匹配结尾的end字符串
^begin end$ 匹配开始为begin结尾为end的字符串
foobar 匹配字符串foobar
这里开头结尾的定义受标志m影响。
量词— * + ? and {}
abc* 匹配ab之后紧跟0个或多个c
abc+ 匹配ab之后紧跟1个或多个c
abc? 匹配ab之后紧跟0个或1个c
abc{num} 匹配ab之后紧跟num个c
abc{num,} 匹配ab之后紧跟num个或更多c
abc{num1,num2} 匹配ab之后紧跟num1到num2个c
a(bc)* 匹配a之后紧跟0个或多个bc
“或”运算符 — | or []
a(b|c) 匹配a之后紧跟b或c
a[bc] 同上
字符类别— \d \w \s and .
\d 匹配一个数字字符
\w 匹配一个单词
\s 匹配一个空白字符
. 匹配任意字符
将上面的字母大写进行反向匹配:
\D 匹配一个非数字字符
\W 匹配一个非单词
\S 匹配一个非空白字符
转义字符
下面几个字符都需要进行转义,在字符前加\
即可:
^ . [ $ ( ) | * + ? { \
分组和捕获 — ()
a(bc) 匹配abc,bc分组捕获
a(?:bc) 匹配abc,bc分组,禁用捕获
a(?<foo>bc) 匹配abc,bc分组捕获,将分组命名为foo
括号内的字符串形成一个分组,可以和“量词”连用。
分组捕获的内容可以用于“反向引用”(见后文),还可以用编程语言(JS,C/C++,Python,Java)提取出来。多个匹配结果以数组的形式输出;如果使用分组命名,将以map的形式输出,键名为每个分组的名称。
括号表达式 — []
[abc] 匹配其中任一字符
[a-z] 匹配a-z的任一字符
[a-fA-F0-9] 匹配这些范围内的任一字符
[^a-zA-Z] 匹配任一不在这些范围内的字符
贪婪和懒惰匹配
* + {}
默认以贪婪模式进行搜索,尽可能地扩展搜索范围。
比如对This is a <div> simple div</div> test
执行<.+>
模式匹配,将得到<div> simple div</div>
。
在后面加上?
可以让它以lazy模式进行搜索。
<.+?> 匹配<和>中的任意内容,必要时才扩展
<[^<>]+> 比上面的更严谨一些
分界符— \b and \B
\babc\b 对abc全词匹配
\Babc\B abc必须被其他字符环绕
反向引用 — \1
([abc])\1 匹配和第一个捕获分组相同的内容
([abc])([de])\2\1 \n代表从左到右第n个捕获分组
(?<foo>[abc])\k<foo> 通过名称引用之前的捕获分组
先行断言和后行断言 — (?=) and (?<=)
d(?=r) 匹配d后紧跟r的字符串,不把r包括在内
(?<=r)d 匹配d之前紧跟r的字符串,不把r包括在内
同样可以使用它的否定操作符:(?!r)
和(?<!r)
。