Регулярное выражение для исключения набора ключевых слов - PullRequest
45 голосов
/ 22 сентября 2008

Мне нужно выражение, которое не будет работать, когда оно встречает такие слова, как "boon.ini" и "http". Цель состоит в том, чтобы взять это выражение и создать его для любого набора ключевых слов.

Ответы [ 7 ]

46 голосов
/ 22 сентября 2008
^(?:(?!boon\.ini|http).)*$\r?\n?

(взято из библиотеки RegexBuddy ) будет соответствовать любой строке, которая не содержит boon.ini и / или http. Это то, что вы хотели?

14 голосов
/ 07 мая 2009

Альтернативное выражение, которое можно использовать:

^(?!.*IgnoreMe).*$

^ = указывает начало строки
$ = указывает на конец строки
(?! Expression) = указывает на нулевую ширину, взгляд вперед отрицательное совпадение в выражении

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

например. Если вы используете регулярное выражение:

(?!.*IgnoreMe).*$

При вводе «Hello IgnoreMe Please» это приведет к чему-то вроде: «gnoreMe Please», так как негативный взгляд вперед обнаружит, что после «I» нет полной строки «IgnoreMe».

13 голосов
/ 22 сентября 2008

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

\b(boon\.ini|http)\b

Вернет true, если boon.ini или http будет где-нибудь в вашей строке. Он не будет соответствовать словам типа httpd или httpxyzzy из-за \b или границ слов. Если вы хотите, вы можете просто удалить их, и это будет соответствовать тем же. Чтобы добавить больше ключевых слов, просто добавьте больше каналов.

\b(boon\.ini|http|foo|bar)\b
4 голосов
/ 22 сентября 2008

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

Например, в Perl вы бы использовали:

if (!/boon\.ini|http/) {
    # the string passed!
}
2 голосов
/ 09 мая 2010
^[^£]*$

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

1 голос
/ 22 сентября 2008

Какой язык / библиотека регулярных выражений? Я думал, что ваш вопрос касался ASP.NET, и в этом случае вы можете увидеть раздел «отрицательный взгляд» этой статьи: http://msdn.microsoft.com/en-us/library/ms972966.aspx

Строго говоря, отрицание регулярного выражения по-прежнему определяет обычный язык, но очень мало библиотек / языков / инструментов, позволяющих его выразить.

Отрицательный взгляд может служить вам так же, но фактический синтаксис зависит от того, что вы используете. Ответ Тима - пример с (?...)

0 голосов
/ 28 октября 2013

Я использовал это (основываясь на ответе Тима Пицкера), чтобы исключить непроизводственные URL субдоменов для фильтров профиля Google Analytics:

^\w+-*\w*\.(?!(?:alpha(123)*\.|beta(123)*\.|preprod\.)domain\.com).*$

Вы можете увидеть контекст здесь: Регулярное выражение для исключения нескольких слов

...