Регулярное выражение, которое никогда не сравнится ни с чем - PullRequest
112 голосов
/ 12 ноября 2009

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

Итак, о чем ты думаешь - как выглядит Regex, который никогда не будет совпадать ни с одной строкой!

Редактировать : Почему я этого хочу? Ну, во-первых, потому что мне интересно думать о таком выражении, а во-вторых, потому что он мне нужен для сценария.

В этом сценарии я определяю словарь как Dictionary<string, Regex>. Как вы видите, она содержит строку и выражение.

Основываясь на этом словаре, я создаю методы, которые все используют этот словарь только как ссылку на то, как они должны выполнять свою работу, один из них сопоставляет регулярные выражения с анализируемым лог-файлом.

Если выражение соответствует, добавляется другое Dictionary<string, long> значение, возвращаемое выражением. Итак, чтобы перехватить любые сообщения журнала, которые не соответствуют выражению в словаре, я создал новую группу под названием «unknown».

К этой группе добавляется все, что не соответствует ничему другому. Но для того, чтобы «неизвестное» выражение не совпадало (случайно) с лог-сообщением, мне пришлось создать выражение, которое наверняка никогда не будет совпадать, независимо от того, какую строку я ему даю.

Таким образом, у вас есть причина для этого "ненастоящего вопроса" ...

Ответы [ 25 ]

70 голосов
/ 04 декабря 2009

Кредитное плечо negative lookahead:

>>> import re
>>> x=r'(?!x)x'
>>> r=re.compile(x)
>>> r.match('')
>>> r.match('x')
>>> r.match('y')

этот RE является противоречием в терминах и поэтому никогда не будет ничего соответствовать.

Примечание:
В Python re.match () неявно добавляет якорь начала строки (\A) к началу регулярного выражения. Этот якорь важен для производительности: без него будет сканироваться вся строка. Те, кто не использует Python, захотят добавить привязку явно:

\A(?!x)x
62 голосов
/ 12 ноября 2009

Это на самом деле довольно просто, , хотя это зависит от реализации / flags *:

$a

Будет соответствовать символу a после конца строки. Удачи.

ВНИМАНИЕ:
Это выражение дорогое - оно просканирует всю строку, найдет привязку конца строки, и только затем не найдет a и выдаст отрицательное совпадение. (См. Комментарий ниже для более подробной информации.)


* Изначально я не особо задумывался о регулярном выражении в многострочном режиме, где $ также соответствует концу строки. Фактически, она будет соответствовать пустой строке прямо перед новой строкой , поэтому обычный символ, такой как a, никогда не может появиться после $.

33 голосов
/ 12 ноября 2009

оглянись:

(?=a)b

Для новичков в регулярных выражениях: положительный взгляд вперед (?=a) гарантирует, что следующий символ - a, но не меняет местоположение поиска (или не включает 'a' в соответствующей строке). Теперь, когда следующий символ подтвержден как a, оставшаяся часть регулярного выражения (b) совпадает, только если следующий символ b. Таким образом, это регулярное выражение соответствует, только если символ одновременно является a и b.

31 голосов
/ 20 февраля 2010

Тот, который был пропущен:

^\b$

Не может соответствовать, потому что пустая строка не содержит границы слова. Протестировано в Python 2.5.

29 голосов
/ 12 ноября 2009

a\bc, где \b - выражение нулевой ширины, соответствующее границе слова.

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

19 голосов
/ 04 декабря 2009

$.

.^

$.^

(?!)

11 голосов
/ 12 ноября 2009

Максимальное совпадение

a++a

Как минимум один a, за которым следует любое количество a без возврата. Затем попробуйте сопоставить еще один a.

или Независимое подвыражение

Это эквивалентно размещению a+ в независимом подвыражении, за которым следует другое a.

(?>a+)a
10 голосов
/ 05 декабря 2009

Perl 5.10 поддерживает специальные управляющие слова, называемые "глаголами", которые заключены в последовательность (*...). (Сравните с (?...) специальной последовательностью.) Среди них он включает (*FAIL) глагол , который немедленно возвращается из регулярного выражения.

Обратите внимание, что глаголы также реализованы в PCRE вскоре после этого, так что вы можете использовать их в PHP или других языках, используя библиотеку PCRE. (Однако нельзя использовать Python или Ruby. Они используют собственный движок.)

9 голосов
/ 31 января 2011
\B\b

\b соответствует границам слова - позиция между буквой и буквой (или границей строки).
\B является его дополнением - оно соответствует положению между двумя буквами или между не-буквами.

Вместе они не могут соответствовать ни одной позиции.

Смотри также:

8 голосов
/ 12 ноября 2009

Это похоже на работу:

$.
...