Regex - сопоставить все, кроме определенной строки

Мне нужно регулярное выражение (будет использоваться в маршрутизации ZF2, я считаю, что он использует preg_match php), который соответствует чему-либо, кроме конкретной строки.

Например: мне нужно сопоставить что угодно, кроме "красного", "зеленого" или "синего".

В настоящее время у меня есть регулярное выражение:

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

test -> match (correct)
testred -> match (correct)
red -> doesn't match (correct)
redtest -> doesn't match (incorrect)

В последнем случае регулярное выражение не ведет себя так, как я хочу. Он должен соответствовать "redtest", потому что "redtest" не является ( "красный", "зеленый" или "синий" ).

Любые идеи о том, как исправить регулярное выражение?

Ответ 1

Вы можете включить конец привязки строки в lookahead

 ^(?!(red|blue|green)$)

Ответ 2

Возможно, это регулярное выражение может помочь вам:

^(?!red|green|blue)(.+)|(.+)(?<!red|green|blue)$

Посмотрите на Rubular.

Ответ 3

Regexp вроде этого включает условие второго блока - YOUR_REGEXP и исключает условие первого блока. В этом случае, если ваша строка будет содержать красный, зеленый или синий результат всегда, будет false

'(?si)(?!.*(red|green|blue).*)(.*(YOUR_REGEXP).*)'