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

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

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

ПОЯСНЕНИЯ:

Я хотел соответствовать чему-либо, что не было ТОЧНО ФУ или баром.

3 ответа

Решение

Ответ на вопрос: "Регулярное выражение, чтобы сопоставить что-либо, кроме"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 если ваша строка может содержать символы новой строки, которые вы также хотите соответствовать.

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

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

^((?!word).)*$

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

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

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

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

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

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

Могут ли они быть частью другой строки, как в @Tim's 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"
Другие вопросы по тегам