捕获组的负向前瞻

Jam*_*s B 6 regex backreference regex-negation capturing-group regex-lookarounds

我正在尝试这个挑战:

https://regex.alf.nu/4

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

比赛:

aesthophysiology
amphimictical
baruria
calomorphic
Run Code Online (Sandbox Code Playgroud)

不匹配

anallagmatic
bassarisk
chorioallantois
coccomyces
abba
Run Code Online (Sandbox Code Playgroud)

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

(\w)(\w)\2\1
Run Code Online (Sandbox Code Playgroud)

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

^((?!(\w)(\w)\2\1).)*$
Run Code Online (Sandbox Code Playgroud)

然而,这符合一切.

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

^((?!agm).)*$
Run Code Online (Sandbox Code Playgroud)

正则表达式与字符串"anallagmatic"不匹配,这是期望的行为.

因此看起来问题在于我在负向前瞻中使用捕获组和反向引用.

vks*_*vks 5

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

    ^^
Run Code Online (Sandbox Code Playgroud)

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

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

如果您创建第一组,您的方法也将有效non capturing.

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

 ^^
Run Code Online (Sandbox Code Playgroud)

看看demo.它没有用,因为它 \2 \1与你的意图不同.在你的正则表达式中它们应该是\3\2.

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