2013-02-01 11 views
7

Czy każdy może podać mi wyrażenie regularne do sprawdzania poprawności łańcucha znaków, które nie powinno zezwalać na stosowanie znaków specjalnych z wyjątkiem odwrotnego ukośnika. PróbowałemWyrażenie regularne umożliwiające odwrotny ukośnik w języku C#

var regexItem = new Regex("^[a-zA-Z0-9\\\ ]*$"); 

Ale to nie wydają się działać

+3

"nie wydaje się działać" oznacza? Co robi, czego się nie spodziewasz? –

Odpowiedz

8

albo trzeba podwoić uciec (raz dla C# i raz na silniku Regex):

var regexItem = new Regex("^[a-zA-Z0-9\\\\ ]*$"); 

lub można użyj verbatim string feature C# (uwaga @):

var regexItem = new Regex(@"^[a-zA-Z0-9\\ ]*$"); 

w dosłownego łańcucha, odwrotny ukośnik nie Wykładnia ted jako początek sekwencji ucieczki, więc wystarczy raz uciec z niego do silnika Regex.

Zakładam, że twój obecny kod nie zostanie skompilowany. Powinien powiedzieć coś podobnego do "Nierozpoznanej sekwencji ucieczki".
Powodem tego jest trzy odwrotne ukośniki, po których następuje spacja. Pierwsze dwa ukośniki odwrotne są interpretowane jako sekwencja escape reprezentująca ukośnik odwrotny, ale trzeci ukośnik odwrotny jest interpretowany jako rozpoczynający sekwencję specjalną z spacją jako drugim znakiem. Taka sekwencja ucieczki nie istnieje, co prowadzi do błędu.

0

Trzeba by uciec \ dla regex, jak C# ciąg dodając \s do dopasowania pojedynczy \.

17

ukośniki muszą być uciekł w wyrażeniach regularnych - i również trzeba uciec w C#, chyba że używasz verbatim string literals. Więc albo z nich powinno działać:

var regexItem = new Regex(@"^[a-zA-Z0-9\\ ]*$"); 
var regexItem = new Regex("^[a-zA-Z0-9\\\\ ]*$"); 

Oba zapewnić następującą treść łańcuch jest przekazywany do konstruktora Regex:

^[a-zA-Z0-9\\ ]*$ 

Kod Regex wtedy oglądnąć podwójnej backslash i traktować go jako "Naprawdę chcę dopasować postać z ukośnika odwrotnego."

Zasadniczo zawsze trzeba rozróżnić "zawartość napisów, które chcesz przekazać do silnika regex" i "reprezentację literową ciągu znaków w kodzie źródłowym". (Jest to prawdą nie tylko dla wyrażeń regularnych, oczywiście Debuger nie pomaga w ucieczce przez okna Watch itp.)

EDIT: Teraz pytanie zostało edytowane aby pokazać, że pierwotnie miał trzy backslashy , to po prostu nie jest prawidłowe C#. Podejrzewam ty mające na „sznurku z trzech ukośniki w” co byłoby jedną z nich:

var regexItem = new Regex(@"^[a-zA-Z0-9\\\ ]*$"); 
var regexItem = new Regex("^[a-zA-Z0-9\\\\\\ ]*$"); 

... ale nie trzeba się uciec z miejsca o ile jest wyrażenie regularne zaniepokojony.

+0

Należy zauważyć, że nic nie jest przekazywane do regulatora Regex, ponieważ kod nie jest kompilowany. –

+1

@DanielHilgarth: Kod, który * pokazał * w pytaniu skompilowanym przed edycją.(Kiedy odpowiedziałem na pytanie, pytanie pokazało dwa backslashe, nie w stylu kodu, i rozumiem, że przecena miała trzy odwrotne ukośniki, ale odpowiadałem na pytanie, które widziałem :) –

+0

Po prostu sformatowałem kod. Proszę spojrzeć na źródło oryginalnej wersji. Trzy backslashe były tam od początku. –

Powiązane problemy