2009-07-30 5 views
41

В C#, я хочу использовать регулярное выражение соответствует ни одному из этих слов:Regex.Match целые слова

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

Я хочу найти целые слова в строке содержимого. Я думал, что это regex бы сделать это:

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

но возвращает истину слова, как participants, хотя я только хочу все слово pants.

Как я могу сопоставить только эти буквальные слова?

ответ

72

Вы должны добавить слово разделитель вашей регулярное выражение:

\b(shoes|shirt|pants)\b 

В коде:

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

поставить границу слова на нем с помощью \ б метапоследовательностью.

+3

Это дает ответ, хотя и не выражение регулярного выражения. – escist

4

Вам нужен нулевой ширины утверждение с обеих сторон, что символы до или после слова не являются частью слова:

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

Как и другие предложили, я думаю\ б будет работать вместо (? = (\ W | ^)) и (?! (\ W | $)), даже если слово находится в начале или конце входной строки, но я не уверен.

+0

Ваш шаблон лучше, чем с «\ b», потому что последний не будет использовать ключевые слова, которые, например, заканчиваются запятой («keyword»), в то время как это ожидалось. Кроме того, правильный шаблон: (? <= \ W | ^) (ключевое слово) (? = \ W | $) –

13

Попробуйте

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

\b матчи по границам слов. См. here для более подробной информации.

Смежные вопросы