(?<!a)b?c
针对 abc
,此正则表达式与 c
匹配。我错过了什么吗?
最佳答案
是的,这是正确的。以下是从引擎角度对比赛的快速浏览。
- 尝试从
a
之前的位置开始匹配。失败。字符串前进。 - 尝试从
a
之前的位置开始匹配。失败。字符串前进。 - 当前位置:
c
之前 - 是否可以进行负向回顾
(?<!a)
断言前面的不是a
? 检查。(这是b
) - 可以
b?
匹配零或一b
? 检查。我们匹配零b
- 可以
c
匹配c
? 检查。 - 还有更多标记可以匹配吗?没有。我们有一场比赛。
向后看
在.NET中,它具有无限的lookbehind,你可以使用这个:
(?<!a.*)b?c
但是 PCRE 没有无限的向后查找。您可以使用它来代替:
^[^a]*\Kb?c
它是如何工作的:
^
anchor 断言我们位于字符串的开头-
[^a]*
匹配任何非 a 字符 \K
告诉引擎从它返回的最终匹配中删除到目前为止匹配的内容-
b?c
匹配可选的b
和c
关于regex - 负向后查找在可选 token 之前失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24858659/