正则表达式的前后断言和贪婪搜索惰性模式
前后断言 / 前瞻后顾
正则表达式中的前后断言,也叫做前瞻(lookahead)后顾(lookbehind),正常布局的右边即为往前正向前瞻,左边为往后反向后顾。
括号内 y 为一段正则表达式,当括号内 y 成立的时候,匹配到 x。
字符 | 名称 | 含义 | 名词 | 兼容性 |
|---|---|---|---|---|
| x(?=y) | positive lookahead (?=ABC) | 匹配 x 仅仅当 x 后面跟着 y | 先行断言、前瞻断言 | baseline |
| (?<=y)x | positive lookbehind (?<=ABC) | 匹配 x 仅当 x 前面是 y | 后行断言、后顾断言 | 2020 年后 |
| x(?!y) | negative lookahead (?!ABC) | 仅仅当 x 后面不跟着 y 时匹配 x | 先行否定断言、负前瞻(正向否定查找) | baseline |
| (?<!y)x | negative lookbehind (?<!ABC) | 仅仅当 x 前面不是 y 时匹配 x | 后行否定断言、负后顾(反向否定查找) | 2020 年后 |
参考:
命名组 / 非捕获组
字符 | 名称 | 含义 |
|---|---|---|
| (?<year>x) | 命名组 | 在左括号后紧跟着放置 ? |
| x(?:y) | 非捕获组 | 通过在开头添加 ?: 来排除组 |
参考:
贪婪搜索 / 惰性模式 / 侵占模式
在正则匹配后面添加量词,默认情况都是 贪婪( Greedy )模式,量词都会尽可能多地重复。在后面再加上一个 ? 则为 惰性模式( Lazy )。在后面加上一个 + 则为 侵占模式( Possessive )
- 贪婪模式:尽可能多的(贪婪),如果引擎尝试回溯则放弃字符(温和)
- 惰性模式:尽可能少地允许整体模式匹配(懒惰)
- 侵占模式:尽可能多的(贪婪),如果引擎尝试回溯则不放弃字符(占有)
注: 侵占模式 在 regex101 上只有 PCRE (PHP) 和 JAVA 8 支持 ,维基 上说 在 Java 和 Python 3.11+ 支持。
| 量词 | 最小值 | 最大值 | 贪婪模式 | 惰性模式 | 侵占模式 |
|---|---|---|---|---|---|
| atom? | 0 | 1 | ? | ?? | ?+ |
| atom* | 0 | Infinity | * | *? | *+ |
| atom+ | 1 | Infinity | + | +? | ++ |
| atom{5} | 5 | 5 | {count} | {count}? | {count}+ |
| atom{1,} | 1 | Infinity | {min,} | {min,}? | {min,}+ |
| atom{1,5} | 1 | 5 | {min,max} | {min,max}? | {min,max}+ |
参考: