PCRE正则表达式求助:按规则捕获任意位置foo与行尾bar
解决PCRE正则捕获问题
修正后的正则表达式
^(?:.*?(foo)(?:.*(bar))?$|^(bar)$)
正则说明
这个正则通过分支逻辑覆盖所有需求场景:
- 第一个分支
.*?(foo)(?:.*(bar))?$:处理包含foo的所有情况.*?(foo):非贪婪匹配到任意位置的foo并完成捕获(?:.*(bar))?$:仅当bar位于行尾时,才匹配并捕获它
- 第二个分支
^(bar)$:仅匹配单独一行的bar并捕获 - 首尾的
^和$锚定整行,避免部分匹配引发的错误
原正则的问题分析
你使用的 (?:.*?(foo)?).*?(bar)?$ 存在核心逻辑缺陷:(foo)? 是可选捕获组,结合非贪婪的.*?,正则引擎会优先选择不捕获foo的路径。比如处理bar foo时,引擎会先让.*?匹配空内容,再用.*?(bar)?$匹配整行(因行尾无bar,组2为空),直接跳过了foo的捕获逻辑。
测试验证
用pcretest测试修正后的正则,结果完全符合需求:
~/ % pcretest PCRE version 8.45 2021-06-15 re> "^(?:.*?(foo)(?:.*(bar))?$|^(bar)$)" data> foo 0: foo 1: foo data> bar foo 0: bar foo 1: foo data> foo bar 0: foo bar 1: foo 2: bar data> bar 0: bar 3: bar data> abc foo 0: abc foo 1: foo data> abc foo bar 0: abc foo bar 1: foo 2: bar data> abc bar No match
内容的提问来源于stack exchange,提问作者mortenbo
相关产品推荐
相关产品推荐

