2010-03-30 15 views
6

Ho read che per far corrispondere una parola all'interno di una stringa utilizzando le espressioni regolari (in .NET), posso usare lo specificatore del limite di parole (\b) all'interno dell'espressione regolare. Tuttavia, nessuna di queste chiamate risulta in alcuna corrispondenzaUn'espressione molto semplice non funziona

Regex.Match("INSERT INTO TEST(Col1,Col2) VALUES(@p1,@p2)", @"\[email protected]\b"); 

Regex.Match("INSERT INTO TEST(Col1,Col2) VALUES(@p1,@p2)", @"\bINSERT\b"); 

C'è qualcosa che sto facendo male?

EDIT: Il secondo sta già lavorando;)

risposta

9

Aggiornamento: Come another answer sottolineato, @ non è un carattere di parola in modo non c'è una parola confine tra @ e lo spazio. Come soluzione alternativa, si potrebbe invece utilizzare un negative lookbehind:

@"(?<!\w)@p1\b" 

risposta originale: Hai bisogno di un @ davanti ai vostri espressioni regolari:

@"\[email protected]\b" 

Senza questo, la stringa " \ b "è interpretato come un backspace (carattere 8), non un limite di parola di espressioni regolari. Vi sono ulteriori informazioni sui valori letterali @-quoted string su MSDN.

Un modo alternativo senza utilizzare @ stringhe letterali -quoted è quello di fuggire i tuoi backslash:

"\\[email protected]\\b" 
1

Il \ sta ottenendo sfuggito nelle stringhe - è necessario utilizzare string literals per evitare questo:

@"\bINSERT\b" 

Altrimenti l'espressione regolare vede "bINSERTb".

+0

Appena avuto questo problema, tutto funzionava nei miei vari tester RegEx esterni; solo non nel mio codice - ho dimenticato il @. – ProVega

4

Il secondo caso è risolto da @"\bINSERT\b" come indicato in un'altra risposta.

Tuttavia /b partite a:

  • prima del primo carattere della stringa , se il primo carattere è un carattere parola.
  • Dopo l'ultimo carattere nella stringa , se l'ultimo carattere è un carattere di parola .
  • Tra due caratteri nella stringa, dove uno è un carattere di parola e l'altro non è un carattere di parola.

un carattere di parola è uno dei [a-zA-Z0-9_] in modo che il primo caso non è risolvibile anteponendo @ per sfuggire al carattere \b perché si sta cercando di abbinare poi un carattere di parola non (@).


Aggiornamento: Il primo caso può essere risolto da un negativo look-dietro affermazione, ma anche utilizzando una parola negata confine \B che si traduce in una sintassi più pulito (@"\[email protected]\b").

+0

Oh, grazie per averlo sottolineato;) C'è un modo per superarlo? –

+0

@Thomas Wanner, è possibile utilizzare le espressioni regolari Lookbehind Zero-Width Assertions. Check Mark Byers risponde per una soluzione. –

Problemi correlati