2009-07-30 14 views
41

In C#, ich möchte einen regulären Ausdruck verwenden, jeder dieser Wörter entsprechen:Regex.Match ganze Wörter

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

Ich möchte die ganze Wörter in den Inhalt Zeichenfolge zu finden. Ich dachte, das regex würde das tun:

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

aber es für Wörter wie participants true zurück, obwohl ich nur pants das ganze Wort wollen.

Wie passe ich nur diese wörtlichen Wörter an?

Antwort

72

Sie sollten das Wort Begrenzer zu Ihrem regulären Ausdruck hinzu:

\b(shoes|shirt|pants)\b 

In Code:

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

stellten eine Wortgrenze auf die Metasequenz \ b verwenden.

+3

Dies liefert eine Antwort, wenn auch nicht die Regex-Ausdruck. – escist

4

Sie müssen eine Breite von Null Behauptung auf beiden Seiten, die die Zeichen vor oder nach dem Wort nicht Teil des Wortes sind:

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

Wie andere vorgeschlagen, ich denke \ b arbeiten anstelle von (? = (\ W | ^)) und (?! (\ W | $)), auch wenn das Wort am Anfang oder Ende der Eingabezeichenfolge steht, aber ich bin mir nicht sicher.

+0

Ihr Muster ist besser als mit "\ b", da letzteres keine Schlüsselwörter akzeptiert, die beispielsweise mit einem Komma ("Schlüsselwort") enden, obwohl dies erwartet wird. Das korrekte Muster ist auch: (? <= \ W | ^) (Schlüsselwort) (? = \ W | $) –

13

Versuchen

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

\b Matches auf Wortgrenzen. Weitere Informationen finden Sie unter here.

Verwandte Themen