【问题标题】:Regex negation?正则表达式否定?
【发布时间】:2014-01-13 11:53:57
【问题描述】:

我正在打 Regex Golf (http://regex.alf.nu/),我正在打 Abba 洞。我有以下正则表达式完全匹配错误的一面(这是我试图做的):

(([\w])([\w])\3\2)

但是,我现在正试图否定它,以便它与另一方匹配。我似乎无法弄清楚那部分。我试过了:

(?!([\w])([\w])\3\2)

但这没有用。来自正则表达式大师的任何提示?

【问题讨论】:

  • 错误的一面?哪一边?请提供完整的上下文。

标签: regex regex-negation


【解决方案1】:

您可以通过简单地使用. 并删除不必要的括号来缩短它(并获得更多积分):

^(?!.*(.)(.)\2\1)

它只是确保字符串的任何部分都没有“abba”(“abba”在这里表示我们不想匹配的特定顺序中的 4 个字母),而不必匹配整个单词。

【讨论】:

  • 我知道这是旧的,但你能解释一下?! 的工作原理吗?更具体地说,为什么(?!(.)(.)\2\1) 匹配所有内容。
  • @AdiBradfield (?!a)a 永远不会匹配任何东西,因为在(?! ... ) 组之后有a(?!a) 阻止匹配,如果在它之后有a(里面有什么)。同样,(?!a)b 将始终匹配 b,因为虽然 (?!a) 后跟 a 会阻止匹配,但它永远不会发生,因为它后面有一个 b。通过扩展,如果任何行包含a^(?!.*a) 将阻止匹配。锚点和.* 很重要,否则,模式将在可能存在的任何a 之后开始匹配(因为在那之后,不再有a 来阻止匹配。
  • 好的,是的,这很有意义。感谢您的澄清
  • @Zikato 它正在工作;正则表达式只匹配一个空行,如果您只检查匹配与否,这并不重要,请参阅i.stack.imgur.com/5MzvR.png
【解决方案2】:

使用这里的解释:https://stackoverflow.com/a/406408/584663

我想出了:^((?!((\w)(\w)\4\3)).)*$

【讨论】:

    【解决方案3】:

    这里的关键是前导插入符号 ^ 和 .*

    (?! ...) 是一个前瞻结构,因此不会推进正则表达式处理引擎。

    /(?! ...)/ 将正确地为匹配其中表达式的项目返回否定结果; 对于不匹配的项目 (...),正则表达式引擎会继续处理。但是,如果您的正则表达式仅包含 (?! ),则没有任何内容需要处理,并且正则表达式处理位置永远不会前进。 (见great answer)。

    显然,由于剩余的正则表达式为空,它匹配字符串的任何零宽度段,即它匹配任何字符串。

    [开始 SWAG]

    使用插入符号 ^,正则表达式引擎能够识别您正在寻找真正的答案,并且您不希望它告诉您字符串包含零宽度组件。

    [结束 SWAG]

    因此,当 (?!) 成功时,它能够正确地匹配失败。

    【讨论】:

    • 为了使您的 SWAG 更精确,插入符号不允许引擎查找不在字符串开头的零长度匹配项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 2011-07-09
    • 2016-01-21
    相关资源
    最近更新 更多