Регулярное выражение, чтобы соответствовать чему-либо, кроме двух слов - PullRequest
33 голосов
/ 26 июля 2011

Я пытаюсь написать регулярное выражение для соответствия чему-либо, кроме "foo" и "bar". Я нашел, как сопоставить что-либо, кроме одного слова в Регулярное выражение, чтобы соответствовать строке, которая не содержит слова? , но я не очень хорошо разбираюсь в регулярных выражениях и не уверен, как добавить второе слово в этот критерий.

Любая помощь будет наиболее ценится!

РАЗЪЯСНЕНИЯ:

Я хотел сопоставить все, что не было ТОЛЬКО foo или bar.

Ответы [ 3 ]

75 голосов
/ 26 июля 2011

Ответ на вопрос: «Регулярное выражение, совпадающее с чем-либо, кроме« foo »и« bar »?»

^(?!foo$|bar$).*

сделает именно это.

^      # Start of string
(?!    # Assert that it's impossible to match...
 foo   # foo, followed by
 $     # end of string
|      #
 bar$  # bar, followed by end of string.
)      # End of negative lookahead assertion
.*     # Now match anything

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

19 голосов
/ 26 июля 2011

Ответ на вопрос: «Как добавить второе слово к этому критерию

Ответ на вопрос, на который вы ссылаетесь:

^((?!word).)*$

Где (?!word) - негативный прогноз.Ответ на этот вопрос:

^((?!wordone|wordtwo).)*$

Работает для обоих слов.Примечание: вы должны включить опции global и multiline , если у вас есть несколько строк и вы хотите найти соответствие для каждой строки, как другой вопрос.

Разница в том,оговорка о негативном прогнозе: (?!wordone|wordtwo).Оно может быть расширено до любого (разумного) количества слов или предложений.

См. этот ответ для подробного объяснения.

8 голосов
/ 26 июля 2011

Я понимаю, что вы хотите сделать, но особенности того, что вы хотите заблокировать / разрешить, немного неясны. Например, вы хотите заблокировать что-либо, что не является точно foo или bar? Или вы хотите заблокировать что-нибудь , содержащее эти две строки?

Могут ли они быть частью другой строки, как в примерах @Tim foonly или bartender?

Я просто собираюсь предложить шаблоны для каждого из них:

/^(?!foo$|bar$).*/   #credit to @Tim Pietzcker for this one, he did it first
    #blocks "foo"
    #blocks "bar"
    #allows "hello goodbye"
    #allows "hello foo goodbye"
    #allows "foogle"
    #allows "foobar"

/^(?!.*foo|.*bar).*$/
    #blocks "foo"
    #blocks "bar"
    #allows "hello goodbye"
    #blocks "hello foo goodbye"
    #blocks "foogle"
    #blocks "foobar"

/^(?!.*\b(foo|bar)\b).*$/
    #blocks "foo"
    #blocks "bar"
    #allows "hello goodbye"
    #blocks "hello foo goodbye"
    #allows "foogle"
    #allows "foobar"
...