4

Я пытаюсь этот вызов:Negative опережения с группами захвата

https://regex.alf.nu/4

Я хочу, чтобы соответствовать все строки, которые не содержат шаблон ABBA.

Match:

aesthophysiology 
amphimictical 
baruria 
calomorphic 

Не Матч

anallagmatic 
bassarisk 
chorioallantois 
coccomyces 
abba 

Во-первых, у меня есть регулярное выражение, чтобы определить шаблон ABBA.

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

Далее я хочу, чтобы соответствовать строки, которые не содержат этот шаблон:

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

Однако это соответствует всем.

Если я упрощаю, указав буквальную для отрицательного предпросмотра:

^((?!agm).)*$ 

регулярного выражение не соответствует строке «anallagmatic», которая является желаемым поведением.

Так что, похоже, проблема связана со мной, используя группы захвата и обратные ссылки в негативном образе.

ответ

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

    ^^ 

Вы можете использовать lookahead here.See demo.The LOOKAHEAD вы создали был правильным, но вам нужно добавить .* так, что она не может появиться в любом месте строки.

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

Ваш подход также будет работать, если вы сделаете первую группу non capturing.

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

^^ 

См demo.It не работает, потому что \2\1 отличались от того, что вы intended.In вашего регулярного выражения, они должны были \3 и \2.

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

+0

Я вижу, это имеет смысл. Спасибо за объяснение. Я также никогда не сталкивался с сайтом Regex101 раньше, это будет полезно, если мне когда-нибудь придется снова отправлять примеры. –

+0

@JamesB да .... вы можете быстро там научиться и стать Zen :) – vks

Смежные вопросы