2009-07-30 10 views
41

En C#, que quieren utilizar una expresión regular para que coincida con ninguna de estas palabras:palabras completas Regex.Match

string keywords = "(shoes|shirt|pants)"; 

Quiero encontrar las palabras completas en la cadena de contenido. Pensé que esto haría que regex:

if (Regex.Match(content, keywords + "\\s+", 
    RegexOptions.Singleline | RegexOptions.IgnoreCase).Success) 
{ 
    //matched 
} 

pero devuelve cierto para palabras como participants, a pesar de que sólo quiero toda la palabra pants.

¿Cómo hago coincidir solo esas palabras literales?

Respuesta

72

Usted debe agregar el delimitador de palabra a su expresión regular:

\b(shoes|shirt|pants)\b 

En código:

Regex.Match(content, @"\b(shoes|shirt|pants)\b"); 
1

poner un límite de la palabra en él utilizando el \ b metasecuencia.

+3

Esto proporciona una respuesta, aunque no la expresión de expresiones regulares. – escist

4

Se necesita un afirmación de anchura cero a uno y otro lado que los caracteres antes o después de la palabra no son parte de la palabra:

(?=(\W|^))(shoes|shirt|pants)(?!(\W|$)) 

Como otros sugirieron, que que\ b funcionará en lugar de (? = (\ W | ^)) y (?! (\ W | $)) incluso cuando la palabra está al principio o al final de la cadena de entrada, pero no estoy seguro.

+0

Su patrón es mejor que con "\ b", porque este último no tomará palabras clave que, por ejemplo, terminen con una coma ("palabra clave"), mientras que se esperaría. Además, el patrón correcto es: (? <= \ W | ^) (palabra clave) (? = \ W | $) –

13

Trate

Regex.Match(content, @"\b" + keywords + @"\b", RegexOptions.Singleline | RegexOptions.IgnoreCase) 

\b partidos en los límites de palabra. Ver here para más detalles.

Cuestiones relacionadas