(?<!a)b?c
对abc
,此正则表达式匹配c
。我错过了什么吗?
答案 0 :(得分:1)
是的,这是正确的。这是从引擎的角度快速浏览比赛。
a
之前的位置开始匹配。失败。在字符串中前进。a
之前的位置开始匹配。失败。在字符串中前进。c
(?<!a)
可以断言前面的内容不是a
吗? 检查。(它是b
)b?
可以匹配零或一个b
吗? 检查。我们匹配零b
c
可以与c
匹配吗? 检查。 远远落后
在具有无限外观的.NET中,你可以使用它:
(?<!a.*)b?c
但PCRE并没有无限的外观。您可以改为使用它:
^[^a]*\Kb?c
工作原理:
^
锚点断言我们位于字符串的开头[^a]*
匹配任何非字符\K
告诉引擎放弃与其返回的最终匹配项目匹配的内容b?c
与可选的b
和c
答案 1 :(得分:1)
Lookahead和lookbehind,统称为&#34; lookaround&#34; ,零长度断言就像行的起点和终点,以及开始和结束字锚。
他们
do not consume characters in the string
,但只断言是否可以匹配。