Regex отрицание?
Я играю в Regex Golf (http://regex.alf.nu/), и я делаю отверстие Abba. У меня есть следующее регулярное выражение, которое полностью совпадает с неправильной стороной (что я и делал):
(([\w])([\w])\3\2)
Тем не менее, я пытаюсь сейчас отрицать это, чтобы он соответствовал другой стороне. Кажется, я не вижу такой части. Я пробовал:
(?!([\w])([\w])\3\2)
Но это не сработало. Любые подсказки от мастеров регулярных выражений?
Ответы
Ответ 1
Вы можете сделать его намного короче (и получить больше очков), просто используя .
и удалив ненужные парны:
^(?!.*(.)(.)\2\1)
Просто убедитесь, что там нет "abba" ( "abba" здесь означает 4 буквы в том конкретном порядке, который мы не хотим сопоставлять) в любой части строки, не имея соответствия со всем словом.
Ответ 2
Используя объяснение здесь: fooobar.com/questions/199/...
Я придумал: ^((?!((\w)(\w)\4\3)).)*$
Ответ 3
Ключ здесь оказывается ведущим каретом, ^ и. *
(?!...) - это перспективная конструкция, и поэтому не продвигает движок обработки регулярных выражений.
/(?!...)/сам по себе правильно вернет отрицательный результат для элементов, соответствующих выражению внутри; , но для элементов, которые не соответствуют (...), двигатель регулярных выражений продолжает обработку. Однако, если в вашем регулярном выражении содержится только (?!), Обрабатывать нечего, и положение обработки регулярного выражения никогда не продвигается. (См. Этот отличный ответ).
По-видимому, поскольку оставшееся регулярное выражение пустое, оно соответствует любому сегменту нулевой ширины строки, т.е. соответствует любой строке.
[начать SWAG]
С помощью функции caret ^ механизм regex может распознать, что вы ищете реальный ответ, и что вы не хотите, чтобы он сообщил вам, что строка содержит компоненты с нулевой шириной.
[конец SWAG]
Таким образом, он может корректно не соответствовать, когда (?!) преуспевает.