Отрицательный взгляд с захватом групп

Я пытаюсь решить эту проблему:

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).)*$

Регулярное выражение не соответствует строке "аналлагматический", что является желаемым поведением.

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

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

Другие вопросы по тегам