web-dev-qa-db-fra.com

Regex - correspond à tout sauf à une chaîne spécifique

J'ai besoin d'un regex (sera utilisé dans le routage ZF2, je crois qu'il utilise le preg_match de php) qui correspond à tout sauf une chaîne spécifique.

Par exemple: je dois faire correspondre n'importe quoi sauf "rouge", "vert" ou "bleu".

J'ai actuellement la regex: 

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

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

Dans le dernier cas, l'expression régulière ne se comporte pas comme je le souhaite. Il doit correspondre à "redtest" car "redtest" ne l'est pas ("rouge", "vert" ou "bleu").

Des idées sur la façon de réparer la regex?

11
rafaame

Vous pouvez inclure la fin de l'ancre de chaîne dans le préfixe

 ^(?!(red|blue|green)$)
10
Explosion Pills

Peut-être que cette regex peut vous aider:

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

Découvrez ceci à Rubular .

2
NeverHopeless

Une expression rationnelle comme celle-ci inclut la condition du second bloc - YOUR_REGEXP, et exclut la condition du premier bloc. Dans ce cas, si votre chaîne contient red, green ou blue result always serait false

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