【问题标题】:Negative lookahead with capturing groups捕获组的负前瞻
【发布时间】:2015-12-28 00:23:39
【问题描述】:

我正在尝试这个挑战:

https://regex.alf.nu/4

我想匹配所有不包含 ABBA 模式的字符串。

匹配:

aesthophysiology
amphimictical
baruria
calomorphic

不匹配

anallagmatic
bassarisk
chorioallantois
coccomyces
abba

首先,我有一个正则表达式来确定 ABBA 模式。

(\w)(\w)\2\1

接下来我要匹配不包含该模式的字符串:

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

然而这符合一切。

如果我通过为负前瞻指定文字来简化这一点:

^((?!agm).)*$

正则表达式与字符串“anallagmatic”不匹配,这是所需的行为。

所以看起来问题出在我在负前瞻中使用捕获组和反向引用。

【问题讨论】:

    标签: regex regex-negation regex-lookarounds backreference capturing-group


    【解决方案1】:
    ^(?!.*(.)(.)\2\1).+$
    
        ^^
    

    您可以在此处使用lookahead。参见演示。您创建的前瞻是正确的,但您需要添加.*,这样它就不会出现在字符串中的任何位置。

    https://regex101.com/r/vV1wW6/39

    如果您将第一组设为non capturing,您的方法也将奏效。

    ^(?:(?!(\w)(\w)\2\1).)*$
    
     ^^
    

    查看演示。它不起作用,因为 \2 \1 与您的预期不同。在您的正则表达式中,它们应该是 \3\2

    https://regex101.com/r/vV1wW6/40

    【讨论】:

    • 我明白了,这很有道理。感谢您的解释。我以前也从未遇到过 Regex101 网站,如果我不得不再次发布示例,这将很有用。
    猜你喜欢
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 2015-04-14
    • 2016-07-27
    • 1970-01-01
    相关资源
    最近更新 更多