2013-06-05 9 views
11

Ho bisogno di un'espressione regolare (verrà utilizzata nell'instradamento ZF2, credo che utilizzi il preg_match di php) che corrisponde a qualsiasi cosa eccetto una stringa specifica.Regex - corrisponde a qualsiasi stringa eccetto la stringa specifica

Ad esempio: Devo abbinare qualsiasi cosa eccetto "rosso", "verde" o "blu".

Al momento ho la regex:

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

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

In quest'ultimo caso, l'espressione regolare non si sta comportando come voglio. Dovrebbe corrispondere a "redtest" perché "redtest" non è ("red", "green" o "blue").

Qualche idea su come risolvere il regex?

risposta

11

è possibile includere il termine di ancoraggio stringa nel lookahead

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

Questa espressione regolare è la corrispondenza nulla. L'hai provato? – rafaame

+0

@rafaame yup; prova abbinata, testata e redtest, ma non rossa http://rubular.com/r/b9eMsVln1W –

+0

@rafaame forse prova ad aggiungere ". *" alla fine se hai bisogno di catturare effettivamente la stringa –

2

Forse questo regex può aiutarti:

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

Partenza questo a Rubular.

0

Regexp come questo include condizione del secondo blocco - YOUR_REGEXP ed esclude condizione del primo blocco. In questo caso, se la tua volontà stringa contiene rosso, verde o blu risultato sempre sarebbe falsa

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