2011-01-03 17 views
9

Powiel możliwe:
A Regex that will never be matched by anythingProste wyrażenie regularne Perla gwarantowane, że nigdy nie będzie zgodne z ciągiem znaków?

Mam skrypt, który pobiera regex jako parametr. Domyślnie chcę ustawić wyrażenie regularne na coś, co nigdy nie będzie pasować do żadnego ciągu, więc mogę po prostu powiedzieć: najpierw trzeba sprawdzić zdefiniowane ($ regex).

wymyśliłem

qr/[^\s\S]/ 

ale nie wiem, czy to będzie pasowało utf8 jakiś znak, który nie jest ani przestrzeń, ani nie-przestrzeni.

Odpowiedz

20
+0

rozwiązanie MJD jest lepiej niż cokolwiek innego oferowanych tutaj lub na rzekome pytanie dup, że to zasługuje być na bieżąco. – tchrist

+0

@tchrist: Z mojego niewątpliwie wąskiego punktu widzenia, prawie wszystko, co MJD, to czyste złoto. Ten człowiek to Perl Alchemik czy coś takiego. – Hugmeir

+0

Aby podświetlić: pusty wzór '//' lub '(? :)' nie zawiera żadnych elementów, dlatego zawsze pasuje. '(?!)' jest ujemnym wyprzedzeniem dla pustego wzorca (to, co przychodzi pomiędzy '!' i '' 'jest ciałem asercji) i dlatego nigdy nie może się równać. – hobbs

5

Połączyć ujemny wyprzedzający z wyprzedzeniem dla dowolnego znaku, po którym następuje dopasowanie dla tej postaci, np.

/(?!x)x/ 

Działa na wszystkich testowych przypadkach, w które go rzuciłem. Oto niektóre testy na rubular.

Powiązane problemy