Regex to match anything but two words
Solution 1:
Answer to the question: "A Regular Expression to match anything that isn't "foo" and "bar"?"
^(?!foo$|bar$).*
would do exactly that.
^ # 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
You might need to set RegexOptions.Singleline
if your string can contain newlines that you also wish to match.
Solution 2:
Answer to the question: "How to add a second word to this critera?"
The answer of the question you link to is:
^((?!word).)*$
Where (?!word)
is a negative look-ahead. The answer for this question is:
^((?!wordone|wordtwo).)*$
Works for both words. Note: you should enable the global and multiline options, if you have multiple lines and want to match for each line, as the other question.
The difference is the negative look-ahead clause: (?!wordone|wordtwo)
. It can be extended to any (reasonable) amount of words or clauses.
See this answer for a detailed explanation.
Solution 3:
I get what you want to do, but the specifics of what you want to block/allow are a little unclear. For example, do you want to block anything that isn't exactly foo
or bar
? Or do you want to block anything containing those two strings?
Can they be part of another string, as in @Tim's foonly
or bartender
examples?
I'm just going to suggest patterns for each one:
/^(?!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"