2013-02-01 23 views
7

Qualcuno può fornirmi espressioni regolari per la convalida della stringa che non deve consentire alcun carattere speciale tranne il backslash. Ho provatoEspressione regolare per consentire la barra rovesciata in C#

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

Ma non sembra lavorare

+3

"non sembra funzionare" significa? Cosa fa che non ti aspetti? –

risposta

8

Si sia necessario fare doppio escape (una volta per C# e una volta per il motore Regex):

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

oppure si può utilizzare il verbatim string feature di C# (notare la @):

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

In una stringa verbatim, il backslash non è interpre ted come iniziare una sequenza di escape, quindi è sufficiente sfuggire una volta per il motore Regex.

Presumo che il codice corrente non venga compilato. Dovrebbe dire qualcosa sulla falsariga di "Sequenza di escape non riconosciuta".
Il motivo è che si hanno tre barre rovesciate seguite da uno spazio. I primi due backslash vengono interpretati come una sequenza di escape che rappresenta una barra rovesciata, ma la terza barra retroversa viene interpretata come l'avvio di una sequenza di escape con uno spazio come secondo carattere. Tale sequenza di escape non esiste, portando all'errore.

0

Si dovrà sfuggire alla \ per regex così come C# stringa con l'aggiunta di 4 \s per cercare un solo \.

17

rovesciare devono essere sfuggito nelle espressioni regolari - e anche hanno bisogno di essere sfuggito in C#, a meno di utilizzare verbatim string literals. Quindi uno di questi dovrebbe funzionare:

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

Entrambi assicurano che il contenuto seguente stringa viene passata al Regex costruttore:

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

Il codice Regex vedrà, quindi, la doppia barra rovesciata e trattarlo come "Voglio davvero abbinare il carattere backslash."

Fondamentalmente, è sempre necessario distinguere tra "il contenuto della stringa che si desidera passare al motore regex" e "la rappresentazione letterale della stringa nel codice sorgente". (Questo è vero non solo per le espressioni regolari, naturalmente Il debugger non aiuta fuggendo in vigilanza finestre, ecc.)

EDIT: Ora che la questione è stato modificato per mostrare che in origine aveva tre backslash , questo non è C# valido. Ho il sospetto che stavate puntando "una stringa con tre backslash in", che sarebbe uno di questi:

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

... ma non ho bisogno di fuggire lo spazio per quanto riguarda l'espressione regolare è ha riguardato.

+0

Si noti che non viene passato nulla al Regex Ctor, perché il codice non viene compilato. –

+1

@DanielHilgarth: il codice che * ha mostrato * nella domanda compilata prima di essere modificato.(Quando ho risposto alla domanda, la domanda mostrava due barre rovesciate: non in stile codice, e ho capito che il markdown aveva tre backslash, ma stavo rispondendo alla domanda che ho visto :) –

+0

Ho semplicemente formattato il codice. Si prega di dare un'occhiata all'origine della revisione originale. I tre backslash erano lì dall'inizio. –

Problemi correlati