为什么这种负面的前瞻不起作用?

时间:2019-05-31 16:45:32

标签: regex perl regex-lookarounds

以下两个均生成字符串gotcha。为什么?

perl -e 'print "gotcha\n" if "corecaptured" =~ /(?!corecaptured)/;'

perl -e 'print "gotcha\n" if "corecaptured" =~ /(?=corecaptured)/;'

我希望第一个不打印任何内容,因为负前瞻会产生错误的结果,但是我显然遗漏了一些东西。

当我将正则表达式粘贴到调试器中时,会得到意外的结果: https://regex101.com/r/eM4tF1/4

1 个答案:

答案 0 :(得分:2)

您的正则表达式未锚定。第一个条件确实说“字符串"corecaptured"中是否有一个位置,后面没有文本corecaptured?”。

答案是肯定的,因为在偏移量1处,以下字符串为"orecaptured",而不以c开头。这就是正则表达式匹配返回true的原因。

您可能是说/^(?!corecaptured)/,它检查目标字符串是否不是以corecaptured开头。


对于您的regex101链接,它包含一个非常不同的正则表达式:a(?!b)c等效于ac,因为(?!b)c的意思是“匹配c在下一个字符的位置不是b”(或换句话说,“匹配不是c的{​​{1}}”)。

如果您change it to what's in your code,您会看到结果是在偏移量1处成功匹配(长度为0)的单个匹配项:

b