Отрицательный взгляд с захватом групп
Я пытаюсь решить эту проблему:
Я хочу сопоставить все строки, которые не содержат шаблон 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
,