【问题标题】:why does this negative lookahead not work?为什么这种消极的前瞻不起作用?
【发布时间】:2019-10-17 07:55:46
【问题描述】:

以下两个都会产生字符串 gotcha。为什么?

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

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

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

当我将正则表达式插入调试器时,我得到了意想不到的结果: https://regex101.com/r/eM4tF1/4

【问题讨论】:

    标签: regex perl regex-lookarounds


    【解决方案1】:

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

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

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


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

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

    corecaptured
     ^
    

    【讨论】:

    • 或者他们想要/^((?!corecaputered).)*\z/s,这样可以确保没有位置以corecaputered开头,也就是说字符串不包含corecaputered。 (!/corecaptured/ 效率更高,但((?!corecaputered).)* 可以在大模式中使用
    猜你喜欢
    • 1970-01-01
    • 2020-02-05
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    相关资源
    最近更新 更多