【问题标题】:Inverse regex with backreferences [duplicate]带有反向引用的反向正则表达式[重复]
【发布时间】:2020-09-28 11:13:48
【问题描述】:

我正在深入研究正则表达式的工作原理,并且正在努力了解如何反转包含反向引用的正则表达式。

举个例子,假设我不想匹配包含相同字符对的单词,其中第二对被反转:

Words that it must exclude:
abba // (ab/ba pair)
smelled // (el/le pair)
trillion // (il/li pair)

我有这个正则表达式,它可以捕获这样的单词:

(((.)(.)).*\4\3)

但是我该如何反转它呢?我尝试应用负前瞻,但它似乎不起作用:

(?!((((.)(.)).*\4\3))

【问题讨论】:

    标签: regex


    【解决方案1】:

    您可以对 2 个捕获组使用负前瞻。使用负前瞻,您可以排除像 illi in trillion 这样的模式不会发生。

    这也将排除trillllon,因为组 1 和组 2 都包含 l

    \b(?!\w*(\w)(\w)\2\1)\w+\b
    
    • \b字边界
    • (?!负前瞻,断言右边的不是
      • \w* 匹配 0+ 个单词字符
      • (\w)(\w) 2 个捕获组一个接一个地捕获一个单词 char
      • \2\1 2 个反向引用以相反的顺序依次出现
    • )关闭前瞻
    • \w+ 匹配 1+ 个单词字符
    • \b字边界

    Regex demo

    如果您确实想匹配 trillllion 之类的词,您可以在反向引用之前使用另一个否定前瞻。

    \b(?!\w*(\w)(\w)(?!\1)\2(?!\2)\1)\w+\b
    

    Regex demo

    【讨论】:

    • 您能否提供一些参考资料或快速编辑并解释其工作原理?我不是特别想解决任何问题,只是学习东西是如何工作的。虽然正则表达式文档是阅读理论的好地方,但它没有太多复杂用法的实际示例。
    • @Banana 你可能错过了像 rexegg.com 这样的网站
    • 感谢您的快速编辑和解释。我理解语法,我只是无法正确理解为什么有些事情需要这样。例如,在这种情况下,单词边界有什么帮助?负前瞻相对清晰,虽然第一个 \w* 有点令人困惑,为什么反向引用不足以进行反转(因为您示例中的负查找与我的相似,只是添加了 \w*。添加最后的额外字符是有道理的,但同时它带来了一个问题,为什么在负前瞻前面不一样(\w+
    • @WiktorStribiżew 我看到您还在 cmets 中发布了一个模式。也许这也有助于阐明 OP 的模式。
    • @Banana 您在问题中提到了单词,使用点也可能匹配空格,这就是我使用单词字符的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 2017-01-30
    相关资源
    最近更新 更多