2009-07-30 25 views
41

In C#, voglio usare un'espressione regolare per adattarsi a qualsiasi di queste parole:Regex.Match parole intere

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

voglio trovare le intere parole del stringa di contenuto. Ho pensato che questo sarebbe regex farlo:

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

ma restituisce vero per parole come participants, anche se io voglio solo la parola intera pants.

Come abbinare solo quelle parole letterali?

risposta

72

Si dovrebbe aggiungere la parola delimitatore alla regex:

\b(shoes|shirt|pants)\b 

in codice:

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

mettere un confine di parola su di esso utilizzando il \ b metasequenza.

+3

Ciò fornisce una risposta, anche se non l'espressione regex. – escist

4

Hai bisogno di un asserzione a lunghezza zero su entrambi i lati che i personaggi prima o dopo la parola non sono parte della parola:

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

Come altri hanno suggerito, ho che\ b funzionerà invece di (? = (\ W | ^)) e (?! (\ W | $)) anche quando la parola è all'inizio o alla fine della stringa di input, ma non sono sicuro.

+0

Il tuo modello è migliore che con "\ b", perché quest'ultimo non accetta parole chiave che, ad esempio, terminano con una virgola ("parola chiave",), mentre è previsto. Inoltre, lo schema corretto è: (? <= \ W | ^) (parola chiave) (? = \ W | $) –

13

Prova

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

\b corrispondenze su confini di parola. Vedi here per maggiori dettagli.

Problemi correlati