以下两个均生成字符串gotcha。为什么?
perl -e 'print "gotcha\n" if "corecaptured" =~ /(?!corecaptured)/;'
perl -e 'print "gotcha\n" if "corecaptured" =~ /(?=corecaptured)/;'
我希望第一个不打印任何内容,因为负前瞻会产生错误的结果,但是我显然遗漏了一些东西。
当我将正则表达式粘贴到调试器中时,会得到意外的结果: https://regex101.com/r/eM4tF1/4
答案 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