13

我正在尝试这个挑战:

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”不匹配,这是所需的行为。

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

4

1 回答 1

11
^(?!.*(.)(.)\2\1).+$

    ^^

您可以使用lookaheadhere.See demo。您创建的前瞻是正确的,但您需要添加.*它以使其不会出现在字符串中的任何位置。

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

如果你是第一组,你的方法也会奏效non capturing

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

 ^^

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

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

于 2015-09-30T09:20:39.423 回答