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

У меня есть следующие строки:

Message:Polarion commit Mon May 18 06:59:37 CEST 2009
Message:Polarion commit Fri May 15 19:39:45 CEST 2009
Message:424-18: use new variable
Message:Polarion commit Fri May 15 19:29:10 CEST 2009
Message:Polarion commit Fri May 15 19:27:23 CEST 2009
Message:000-00: do something else
Message:Polarion commit Fri May 15 17:50:30 CEST 2009
Message:401-103: added application part
Message:Polarion commit Fri May 15 17:48:46 CEST 2009
Message:Polarion commit Fri May 15 17:42:04 CEST 2009

и я хочу получить все строки, НЕ содержащие "Polarion"

как бы я это сделал?

пс: я видел: регулярное выражение для сопоставления с чем-то, что не является определенной подстрокой но это не помогает мне

pps: я пытаюсь сделать это в tortoiseSVN, чтобы выбрать сообщения журнала, и я думаю, что есть проблема с «негативным взглядом позади»

Ответы [ 6 ]

19 голосов
/ 18 мая 2009

Это выражение сделает работу.

^(?:.(?<!Polarion))*$

Он использует отрицательное утверждение с нулевой шириной, чтобы утверждать, что строка не содержит "Polarion".

    ^                  Anchor to start of string
    (?:                Non-capturing group
        .              Match any character
        (?<!Polarion)  Zero-width negative lookbehind assertion - text to the
                       left of the current position must not be "Polarion"
    )
    *                  Zero or more times
    $                  Anchor to end of string

Следующая версия выполнит утверждение только после 'n' - возможно, это будет быстрее, а может, медленнее.

^(?:[^n]*|n(?<!Polarion))*$
9 голосов
/ 18 мая 2009

Может быть проще, если вы сделаете ваше регулярное выражение совпадающим с тем, что вы ищете, а затем поменяете местами результаты.

Большинство инструментов, использующих Regex, позволяют инвертировать результаты поиска, обычно вызывая опцию 'v' для in V ert (сохраняя i для case- I nsensitive):

например.

grep -v <search>
find /v <search>

и т.д.

3 голосов
/ 20 мая 2009

Вот решение, использующее отрицательный прогноз, который более широко поддерживается, чем прогноз:

^Message:(?!Polarion).*$

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


Объяснение вышеприведенного выражения в форме комментариев регулярного выражения:

(?x)       # Enable comments
^          # Start of string (start of line in multiline mode)
Message:   # Literal text
(?!        # Begin negative lookahead
Polarion   # Literal text
)          # End negative lookahead
.*         # Greedily match any number of any character
$          # End of string (end of line in multiline mode)
0 голосов
/ 04 июня 2014

Как показывает этот ответ , окно поиска TortoiseSVN не ограничено регулярными выражениями. В частности, если выражение заключено в !( ), оно отменяется, и в результате появляются несоответствующие строки. ! отрицает вложенное выражение (обычное или нет).

Для вашего случая,

!(Polarion)

должен сделать трюк.

0 голосов
/ 06 июня 2012

Это сработало для меня и быстро ввести (в диалоговом окне поиска или тому подобное): ^(?!.*not this).*but this

0 голосов
/ 18 мая 2009

Я не смог найти информацию о том, какой движок регулярных выражений использует TortoiseSVN, но вы можете спросить в списке рассылки . Не все двигатели поддерживают расширенные функции, такие как отрицательный просмотр с нулевой шириной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...