Negative Lookbehind在可选令牌之前失败

时间:2014-07-21 06:12:02

标签: regex pcre lookbehind

(?<!a)b?c

abc,此正则表达式匹配c。我错过了什么吗?

2 个答案:

答案 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与可选的bc
  • 相匹配

答案 1 :(得分:1)

Lookahead和lookbehind,统称为&#34; lookaround&#34; 零长度断言就像行的起点和终点,以及开始和结束字锚。

  

他们do not consume characters in the string,但只断言是否可以匹配。

有关详细信息,请参阅Lookahead and Lookbehind Zero-Length Assertions