Match everything except for specified strings

I know that the following regex will match "red", "green", or "blue".

red|green|blue

Is there a straightforward way of making it match everything except several specified strings?


If you want to make sure that the string is neither red, green nor blue, caskey's answer is it. What is often wanted, however, is to make sure that the line does not contain red, green or blue anywhere in it. For that, anchor the regular expression with ^ and include .* in the negative lookahead:

^(?!.*(red|green|blue))

Also, suppose that you want lines containing the word "engine" but without any of those colors:

^(?!.*(red|green|blue)).*engine

You might think you can factor the .* to the head of the regular expression:

^.*(?!red|green|blue)engine     # Does not work

but you cannot. You have to have both instances of .* for it to work.


Depends on the language, but there are generally negative-assertions you can put in like so:

(?!red|green|blue)

(Thanks for the syntax fix, the above is valid Java and Perl, YMMV)