正则表达式

更新于
正则表达式的前后断言和贪婪搜索惰性模式

前后断言 / 前瞻后顾

正则表达式中的前后断言,也叫做前瞻(lookahead)后顾(lookbehind),正常布局的右边即为往前正向前瞻,左边为往后反向后顾。

括号内 y 为一段正则表达式,当括号内 y 成立的时候,匹配到 x

字符
名称含义名词兼容性
x(?=y)positive lookahead
(?=ABC)
匹配 x 仅仅当 x 后面跟着 y先行断言、前瞻断言baseline
(?<=y)xpositive lookbehind
(?<=ABC)
匹配 x 仅当 x 前面是 y后行断言、后顾断言2020 年后
x(?!y)negative lookahead
(?!ABC)
仅仅当 x 后面不跟着 y 时匹配 x先行否定断言、负前瞻(正向否定查找)baseline
(?<!y)xnegative lookbehind
(?<!ABC)
仅仅当 x 前面不是 y 时匹配 x后行否定断言、负后顾(反向否定查找)2020 年后

参考:


命名组 / 非捕获组

字符
名称含义
(?<year>x)命名组在左括号后紧跟着放置 ? 即可完成对括号的命名
x(?:y)非捕获组通过在开头添加 ?: 来排除组

参考:

贪婪搜索 / 惰性模式 / 侵占模式

在正则匹配后面添加量词,默认情况都是 贪婪( Greedy )模式,量词都会尽可能多地重复。在后面再加上一个 ? 则为 惰性模式( Lazy )。在后面加上一个 + 则为 侵占模式( Possessive )

  • 贪婪模式:尽可能多的(贪婪),如果引擎尝试回溯则放弃字符(温和)
  • 惰性模式:尽可能少地允许整体模式匹配(懒惰)
  • 侵占模式:尽可能多的(贪婪),如果引擎尝试回溯则不放弃字符(占有)

注: 侵占模式regex101 上只有 PCRE (PHP) 和 JAVA 8 支持 ,维基 上说 在 Java 和 Python 3.11+ 支持。

量词最小值最大值贪婪模式惰性模式侵占模式
atom?01????+
atom*0Infinity**?*+
atom+1Infinity++?++
atom{5}55{count}{count}?{count}+
atom{1,}1Infinity{min,}{min,}?{min,}+
atom{1,5}15{min,max}{min,max}?{min,max}+

参考: