2010-03-30 26 views
6

Tengo read que para hacer coincidir una palabra dentro de una cadena usando expresiones regulares (en .NET), puedo usar la palabra especificador de límite (\b) dentro de la expresión regular. Sin embargo, ninguna de estas llamadas da como resultado ninguna coincidenciaRegex muy simple no funciona

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"); 

¿Hay algo que esté haciendo mal?

EDIT: El segundo ya está trabajando;)

Respuesta

9

actualización: Como se señaló another answer, @ no es un carácter de palabra lo que no hay límite de palabra entre @ y el espacio. Como solución alternativa, se podría utilizar en su lugar un negative lookbehind:

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

Respuesta original: Se necesita un @ delante de sus expresiones regulares:

@"\[email protected]\b" 

Sin esto, la cadena " \ b "se interpreta como un retroceso (carácter 8), no como un límite de palabra de expresión regular. Hay más información sobre literales @-quoted string en MSDN.

Una forma alternativa sin necesidad de utilizar literales de cadena @ -quoted es escapar sus barras invertidas:

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

El \ está consiguiendo escapado en las cadenas - es necesario utilizar string literals para evitar esto:

@"\bINSERT\b" 

De lo contrario, la expresión regular ve "bINSERTb".

+0

Acabo de tener este problema, todo estaba funcionando en mis varios probadores RegEx externos; simplemente no está en mi código - Olvidé el @. – ProVega

4

El segundo caso se resuelve por @"\bINSERT\b" como se indica en otra respuesta.

Sin embargo /b partidos en:

  • antes del primer carácter de la cadena , si el primer carácter es un carácter palabra.
  • Después del último carácter en la cadena , si el último carácter es un carácter de palabra .
  • Entre dos caracteres en la cadena, donde uno es un carácter de palabra y el otro no es un carácter de palabra.

un carácter de palabra es una de [a-zA-Z0-9_] por lo que el primer caso no es solucionable mediante un prefijo @ escapar el carácter \b porque usted está tratando de igualar a continuación, un carácter de palabra no (@).


Actualización: El primer caso puede ser resuelto por una afirmación negativa mirada detrás, sino también mediante el uso de un límite \B palabra negada que se traduce en una sintaxis más limpia (@"\[email protected]\b").

+0

Oh, gracias por señalar eso;) ¿Hay alguna manera de superarlo? –

+0

@Thomas Wanner, puede usar las expresiones regulares Look-behind Zero-Width Afirmaciones. Marque la respuesta de Mark Byers para una solución. –