2009-07-30 15 views
41

W C#, chcę użyć wyrażenia regularnego, aby dopasować każdy z tych wyrazów:Regex.Match całe słowa

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

Chcę znaleźć całe wyrazy w ciągu zawartości. Myślałem, że to zrobi regex że:

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

ale zwraca true dla takich słów, jak participants, choć chcę tylko całe słowo pants.

Jak dopasować tylko te dosłowne słowa?

Odpowiedz

72

Należy dodać separator słów do wyrażenia regularnego:

\b(shoes|shirt|pants)\b 

W kodzie:

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

umieścić granicę słowa na nim za pomocą \ b Metasekwencja.

+3

Zapewnia to odpowiedź, ale nie wyrażenie regularne. – escist

4

Musisz zerowej szerokości twierdzenie, po obu stronach, że znaki przed lub po słowie nie są częścią słowa:

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

Jak inni sugerowane, myślę\ b zadziała zamiast (? = (\ W | ^)) i (?! (\ W | $)) nawet jeśli słowo znajduje się na początku lub końcu ciągu wejściowego, ale nie jestem pewien.

+0

Twój wzór jest lepszy niż z "\ b", ponieważ ten drugi nie będzie używał słów kluczowych, które na przykład kończą się przecinkiem ("słowo kluczowe"), podczas gdy można się tego spodziewać. Poprawny wzór to: (? <= \ W | ^) (słowo kluczowe) (? = \ W | $) –

13

Spróbuj

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

\b mecze na granicy słów. Aby uzyskać więcej informacji, patrz here.