Почему нужно отрицание регулярного выражения? - PullRequest
2 голосов
/ 23 мая 2010

Есть так много вопросов по регулярному отрицанию здесь, по SO.

Я не уверен, что понимаю, почему люди чувствуют необходимость отрицать регулярное выражение. Почему бы не использовать что-то вроде grep -v, которое показывает только результаты, не соответствующие регулярному выражению?


$ ls
april  august  december  february  january  july  june  march  may  november  october  september
$ ls | grep ber
december
november
october
september
$ ls | grep -v ber
april
august
february
january
july
june
march
may

Ответы [ 3 ]

9 голосов
/ 23 мая 2010

Возможно, потому что grep не единственное место, где используются регулярные выражения? Это работает в этом простом сценарии ... и на самом деле во многих других, где вы можете просто сказать " не соответствует этому регулярному выражению" ... но ... ну, что если вам нужно отменить только часть регулярного выражения? «Соответствует этому, но не соответствует этому», как бы вы это сделали? Вы не можете просто отрицать все это.

2 голосов
/ 23 мая 2010

Вы правы, что нет необходимости отменять целое регулярное выражение, но, безусловно, вы видите значение в отрицании подшаблона в большем шаблоне?

Вот простой пример: разбить строку на прогоны.В Java это просто split на (?<=(.))(?!\1).

System.out.println(java.util.Arrays.toString(
    "aaaabbbccdeeefg".split("(?<=(.))(?!\\1)")
)); // prints "[aaaa, bbb, cc, d, eee, f, g]"

Регулярное выражение:

  • (?<=(.)) - смотреть назад и захватывать символ в \1
  • (?!\1) - смотреть вперед и отрицать совпадение на \1

Похожие вопросы

Во всех этих вопросах используются отрицательные утверждения:

0 голосов
/ 23 мая 2010

Один случай, когда я помню, что он мне нужен, был в конфигурации Apache. В Apache есть способ перенаправить на другой URI, если текущий запрос соответствует некоторому регулярному выражению PCRE, но нет (или, по крайней мере, было, когда мне это было нужно) способа перенаправить, если текущий запрос не соответствует соответствует регулярному выражению.

К счастью, я смог Google (на самом деле, я не уверен, что Google уже существует & hellip;) для регулярного выражения регулярного выражения-отрицания. Но это заняло у меня некоторое время, и если бы StackOverflow существовал тогда, это было бы на намного проще.

...