Regex отрицание?

Я играю в Regex Golf (http://regex.alf.nu/), и я делаю отверстие Abba. У меня есть следующее регулярное выражение, которое полностью совпадает с неправильной стороной (что я и делал):

(([\w])([\w])\3\2)

Тем не менее, я пытаюсь сейчас отрицать это, чтобы он соответствовал другой стороне. Кажется, я не вижу такой части. Я пробовал:

(?!([\w])([\w])\3\2)

Но это не сработало. Любые подсказки от мастеров регулярных выражений?

Ответы

Ответ 1

Вы можете сделать его намного короче (и получить больше очков), просто используя . и удалив ненужные парны:

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

Просто убедитесь, что там нет "abba" ( "abba" здесь означает 4 буквы в том конкретном порядке, который мы не хотим сопоставлять) в любой части строки, не имея соответствия со всем словом.

Ответ 3

Ключ здесь оказывается ведущим каретом, ^ и. *

(?!...) - это перспективная конструкция, и поэтому не продвигает движок обработки регулярных выражений.

/(?!...)/сам по себе правильно вернет отрицательный результат для элементов, соответствующих выражению внутри; , но для элементов, которые не соответствуют (...), двигатель регулярных выражений продолжает обработку. Однако, если в вашем регулярном выражении содержится только (?!), Обрабатывать нечего, и положение обработки регулярного выражения никогда не продвигается. (См. Этот отличный ответ).

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

[начать SWAG]

С помощью функции caret ^ механизм regex может распознать, что вы ищете реальный ответ, и что вы не хотите, чтобы он сообщил вам, что строка содержит компоненты с нулевой шириной.

[конец SWAG]

Таким образом, он может корректно не соответствовать, когда (?!) преуспевает.