基本元件
元字符
- 特殊单字符
- | - |
---|---|
. | 除了换行符的任意字符 |
\d | 任意数字 |
\w | 任意数字、字母、下划线 |
\s | 任意空白 |
\D | 任意非数字 |
\W | 任意非数字、字母、下划线 |
\S | 任意非空白符 |
- 空白符
- | - |
---|---|
\r | 回车符 |
\n | 换行符 |
\f | 换页符 |
\t | 制表符 |
\v | 垂直制表符 |
\s | 任意空白符 |
- 量词
- | - |
---|---|
* | 0到多次 |
+ | 1到多次 |
? | 0到1次 |
{m} | 出现m次 |
{m,} | 出现至少m次 |
{m,n} | m到n次 |
- 范围
- | - |
---|---|
| | 或, ab | bc 表示 ab 或 bc |
[…] | 多选一,括号中的单个元素 |
[a-z] | 匹配a到z之间任意单元素 |
[^…] | 取反,不包括括号中的任意单个元素 |
量词与贪婪
贪婪模式
表示次数的量词默认是贪婪模式,在贪婪模式下,会尝试尽可能最大长度去匹配。
- 正则表达式
a*
- 测试字符串
aaabb
- 匹配结果
匹配 | 位置 | 匹配内容 | 说明 |
---|---|---|---|
Match 1 | 0-3 | aaa | |
Match 2 | 3-3 | 空字符串 | 星号(*)代表 0 到多次,匹配 0 次就是空字符串 |
Match 3 | 4-4 | 空字符串 | |
Match 4 | 5-5 | 空字符串 |
非贪婪模式
匹配长度尽可能小,在量词后面加上英文的问号 (?),将贪婪模式变成非贪婪模式.
- 正则表达式
a*?
- 测试字符串
aaabb
- 匹配结果
匹配 | 位置 | 匹配内容 | 说明 |
---|---|---|---|
Match 1 | 0-0 | ||
Match 2 | 0-1 | a | |
Match 3 | 1-1 | ||
Match 4 | 1-2 | a | |
Match 5 | 2-2 | ||
Match 6 | 2-3 | a | |
Match 7 | 3-3 | ||
Match 8 | 4-4 | ||
Match 9 | 5-5 |
独占模式
类似贪婪匹配,满足要求的情况下,尽可能长的匹配,但匹配过程不会发生回溯。具体的方法就是在量词后面加上加号(+)。
例子1
- 正则表达式
xy{1,3}+z
- 测试字符串
xyyz
- 匹配结果
xyyz
例子2
- 正则表达式
xy{1,2}+yz
- 测试字符串
xyyz
- 匹配结果
[]
如果是贪婪模式,先按最长匹配,匹配了yy,下一个是z,z和y不匹配,则从yy回溯,吐出一个y,剩一个y,下一个是y,与y匹配,接着匹配z,可以匹配到xyyz。
分组与引用
分组是将子表达式看成一个整体,在后续查找或替换中引用分组。括号在正则中可以用于分组,被括号括起来的部分“子表达式”会被保存成一个子组,第几个括号就是第几个分组。分组可通过编号或者捕获名称来引用。
- | - |
---|---|
(正则) | 捕获分组 |
(?:正则) | 非捕获分组 |
(?P<名称>正则) | 命名分组 |
匹配模式
模式 | 描述 | 例子 |
---|---|---|
(?i) | 不区分大小写模式 | (?i)cat |
(?s) | 单行模式 | (?s).+ |
(?m) | 多行模式 | (?m)^the|cat$ |
(?#comment) | 注释模式 | (\w+)(?#word) \1(?#word repeat again) |
通常情况下,^ 匹配整个字符串的开头,$ 匹配整个字符串的结尾。多行匹配模式改变的就是 ^ 和 $ 的匹配行为。对于 ^ 和 $ 大部分实现默认不是多行匹配模式,但也有例外,比如 Ruby 中默认是多行模式。
断言
用于匹配位置,而不是文本内容本身。
- 单词边界
- | - |
---|---|
\b | 单词边界 |
- 行的开始/结束
- | - |
---|---|
^ | 匹配行的开始 |
$ | 匹配行的结束 |
\A | 仅匹配整个字符串的开始,不支持多行模式 |
\Z | 仅匹配整个字符串的结束,不支持多行模式 |
- 环视
- | - |
---|---|
(?<=Y)X | 匹配前面是Y的X |
(?<!Y)X | 匹配前面不是Y的X |
X(?=Y) | 匹配后面是Y的X |
X(?!Y) | 匹配后面不是Y的X |
正则调试、可视化工具
参考
- 正则表达式入门课 涂伟忠