Регулярное выражение: соответствует только если строка A найдена, а строка B - нет - PullRequest
2 голосов
/ 13 августа 2010

Я пытаюсь написать регулярное выражение, которое будет по существу возвращать true, если строка A найдена, а строка B. не найдена.

Если говорить более конкретно, я ищу любой файл на моем серверев котором есть текст «base64_decode», но не «copyright».

Спасибо!

Ответы [ 5 ]

3 голосов
/ 13 августа 2010

Я не уверен, что ваша настоящая задача может быть решена исключительно с помощью регулярного выражения, переданного в grep, поскольку grep обрабатывает файлы построчно. Я бы использовал опции -l (--files-with-matches) и -L (--files-without-match) вместе с обратными галочками подстановки команд, например:

grep -L copyright `grep -l base64_decode *`

grep -l base64_decode * перечисляет имена всех файлов с "base64_decode" в них, и обратные метки помещают этот список в командную строку после grep -L copyright, который ищет эти файлы и перечисляет подмножество их, которое не содержит "авторское право".

0 голосов
/ 13 августа 2010

Трубочистки должны легко этого добиться:

find -type f -print | xargs grep -l "base64_decode" | xargs grep -L "copyright"

0 голосов
/ 13 августа 2010

Используйте отрицательный взгляд вперед и взгляд назад:

^(?<!.*copyright.*)(base64_decode)(?!.*copyright.*)$

Perl пока не поддерживает это: -P.

0 голосов
/ 13 августа 2010

Не рекомендуется делать это в одном регулярном выражении, но если вам необходимо, вы можете использовать lookaheads:

^(?=.*must-have)(?!.*must-not-have)

Возможно, вы захотите сделать это в однострочном / точечном режиме, и начальный якорь может быть \A вместо ^.

(?=…) - положительный прогноз; он утверждает, что данный шаблон может быть сопоставлен. (?!…) является отрицательным с нетерпением; он утверждает, что данный шаблон НЕ может быть сопоставлен.

Ссылки

0 голосов
/ 13 августа 2010

я думаю, что это

^.*[^copyright].*base64_decode.*[^copyright].*$

однако это поймает фразу copyright где угодно, даже если это не само по себе в слове.

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

например, оно будет соответствовать

This text is non-copyrightable because I said so! but it is not encoded in base64_decode unfortunatly :(
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...