捕获群组的负向前瞻

时间:2015-09-30 09:16:35

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

我正在尝试这个挑战:

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

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

1 个答案:

答案 0 :(得分:5)

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

    ^^

你可以在这里使用lookahead。参见演示。你创建的前瞻是正确的,但你需要添加.*,以便它不会出现在字符串中的任何地方。

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

如果您创建第一组non capturing,您的方法也会有用。

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

 ^^

请参阅demo.It无效,因为\2 \1与您的意图不同。在正则表达式中,它们应该是\3\2

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