2013-04-18 18 views
5

Mam aplikację, która wymaga pewnych weryfikacji dla niektórych pól. Jednym z nich jest nazwisko, które może składać się z 2 słów. W moim regex, muszę zaakceptować te przestrzenie, więc próbowałem wielu rzeczy, ale nie znalazłem żadnego rozwiązania.C# Regex - Zaakceptuj spacje w ciągu znaków

Oto mój regex:

@"^[a-zA-Zàéèêçñ\s][a-zA-Zàéèêçñ-\s]+$" 

\s są zwykle dla przestrzeni, ale to nie działa i mam ten komunikat o błędzie:

parsing "^[a-zA-Zàéèêçñ\s][a-zA-Zàéèêçñ-\s]+$" - Cannot include class \s in character range. 

Wszelkie chłopaki pomysł?

+1

inny temat, ale zajrzyj do [właściwości Unicode] (http://www.regular-expressions.info/unicode.html#prop). '\ p {L}', to pasuje do litery w dowolnym języku, więc twoje wyrażenie będzie wyglądało jak "@"^[\ p {L} \ s] [\ p {L} \ s -] + $ "' jest o wiele ładniejszy i nie musisz myśleć o każdym specjalnym liście. – stema

Odpowiedz

9

- oznacza szereg znaków, tak jak ty użyj A-Z, aby opisać dowolny znak między A i Z. Twój regex używa ñ-\s której silnik próbuje interpretować jako dowolny znak pomiędzy N i \ s - a potem ogłoszeń, które \s nie ma dużo sensu tam, bo \s sama jest tylko skrót dla każdego biały znak.

To stąd bierze się błąd.

Aby pozbyć się tego, należy zawsze umieścić - na koniec z swojej klasy postaci , jeśli chcesz dołączyć do - dosłownego charakter:

@"^[a-zA-Zàéèêçñ\s][a-zA-Zàéèêçñ\s-]+$" 

ten sposób, silnik wie że \s- nie jest zakresem znaków, ale dwoma znakami \s i z osobna.

Innym sposobem jest ucieczka - charakter:

@"^[a-zA-Zàéèêçñ\s][a-zA-Zàéèêç\-\s]+$" 

Więc teraz silnik nie interpretuje ñ\-\s jako zakres znaków, ale jak każdym z bohaterów ñ, - lub \s. Osobiście, choć zawsze staram się unikać ucieczki tak często, jak to możliwe, ponieważ IMHO to się zaciska i niepotrzebnie rozciąga wyrażenia w długości.

+1

Ucieczka jest mniej łamliwa.Powiedzmy, że masz klasę znaków dla operacji: '[+ -]'. Inny programista może zmienić go na '[+ - * /]', łamiąc wzór. – Kobi

+0

Zgadzam się, ale możesz się w to w jakikolwiek sposób spierać. Powiedzmy, że masz wzorzec '[+ \ - *]', ponieważ nie możesz robić podziałów. Któregoś dnia możesz to zrobić, a inny programista zmienia go na '[+/- *]', ponieważ myśli, że masz po prostu ukośne cięcie. Off idzie twojemu ucieczce. Tak naprawdę to nie jest argument za żadnym ze sposobów. Po prostu cenię trochę czytelność, szczególnie w regex, ponieważ są one wystarczająco skomplikowane. –

+0

Wielkie dzięki za odpowiedź! – Traffy

4

Musisz uciec ostatni - charakter - ñ-\s jest analizowany jak zakresie a-z:

@"^[a-zA-Zàéèêçñ\s][a-zA-Zàéèêçñ\-\s]+$" 

Zobacz także na Regex Burza: [a-\s], [a\-\s]

0

[wyrażenie regularne (@ "^ [a-zA-Z \ s] + $", ErrorMessage = "są dozwolone tylko litery i spacje.")]

Działa

Powiązane problemy