2013-06-05 14 views
11

Potrzebuję wyrażeń regularnych (będzie używany w routingu ZF2, uważam, że używa on preg_match of php), który pasuje do niczego poza określonym ciągiem znaków.Regex - dopasuj wszystko z wyjątkiem określonego ciągu

Na przykład: Muszę dopasować wszystko, z wyjątkiem "czerwonego", "zielonego" lub "niebieskiego".

Obecnie mam regex:

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

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

W tym ostatnim przypadku, regex nie zachowuje się jak chcę. Powinien pasować do "redtest", ponieważ "redtest" nie jest ("czerwony", "zielony" lub "niebieski").

Wszelkie pomysły, jak naprawić wyrażenie regularne?

Odpowiedz

11

Można to koniec łańcucha kotwicy w uprzedzona

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

Ten regex jest dopasowanie nic. Testowałeś to? – rafaame

+0

@rafaame yup; dopasowany test, testowany i redytowany, ale nie czerwony http://rubular.com/r/b9eMsVln1W –

+0

@rafaame może spróbuj dodać '. *' na końcu, jeśli chcesz uchwycić ciąg znaków –

2

Może to regex może pomóc:

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

Sprawdź to na Rubular.

0

Regexp podobny do tego zawiera stan drugiego bloku - YOUR_REGEXP i wyklucza warunek pierwszego bloku. W tym przypadku, jeśli twoja wola ciąg zawiera czerwony, zielony lub niebieski wynik zawsze byłoby fałszywy

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