为什么"abcdef"不匹配(?= abc)def但匹配abc(?= def)?

Zaf*_*ffy 7 javascript regex pcre

在Javascript中,我有一个字符串abcdef,无法弄清楚这种奇怪的行为:

  • (?=abc)def 与字符串不匹配
  • abc(?=def) 确实匹配字符串

为什么?

Ro *_* Mi 19

(?=abc)def所述(?=abc)捕获是零宽度,并且不向前移动光标在输入字符串以下一个成功的匹配.那个结构只是简单地说接下来的三个字符,看它们是否是abc,如果他们那么检查是否那些相同的字符 def.此时比赛失败..

您需要了解正则表达式引擎如何完成匹配.考虑您的输入字符串abcdef和正则表达式abc(?=def).引擎通过匹配启动a然后将输入字符串中的光标移动到下一个字符并尝试匹配,b因为输入字符串中的光标在b匹配成功.然后引擎将光标移动到输入字符串内并尝试匹配c,因为光标在输入字符串中,c匹配成功,输入字符串中的光标再次移动到下一个字符.现在引擎遇到(?=def)此时引擎只是向前看,看看光标在输入刺中的下三个字符是否实际上是def 不移动光标,它们是匹配完成的.

现在考虑输入字符串xyz和正则表达式x(?=y)Z.正则表达式引擎将光标放在输入字符串中的第一个字母上并检查它是否为a x并发现x它将光标移动到输入字符串中的下一个字符.现在它向前看是否下一个字符是a y,它是什么,但引擎不会移动输入文本光标前言,因此输入文本中的光标保持在y.接下来,引擎查看光标是否在字母上z,但由于输入文本中的光标仍在字母上,y因此匹配失败.

您可以在http://www.regular-expressions.info/lookaround.html上阅读更多有关正面和负面前瞻的内容