正则表达式:匹配整个单词

64

C# 中,我想使用正则表达式匹配以下任何单词:

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

我想在字符串中找到整个单词。 我认为这个 regex 会做到这一点:

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

但是它会对像 participants 这样的单词返回 true,而我只想匹配整个单词pants

如何只匹配这些文字?

4个回答

115

你应该在正则表达式中添加单词分隔符:

\b(shoes|shirt|pants)\b

在代码中:

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

1
你如何忽略大小写来完成这个任务? - JsonStatham
5
在末尾添加 , RegexOptions.IgnoreCase) - serge
1
注意:在此情况下括号是可选的,去掉它们将简化结果。 - MensSana
@符号是什么意思?它似乎表示字面值,尽管我认为|被解释为OR运算符而不是实际的|字符。此外,似乎必须有@才能使其正常工作。这是真的吗? - JosephDoggie
1
@JosephDoggie 这意味着字符串中的反斜杠不应被解释为转义字符,而是作为字符串的一部分。 - Philippe Leybaert
请查看我的帖子:https://stackoverflow.com/questions/74288960/c-sharp-regex-and-the-operator-which-seems-to-mean-literal -- 我希望这能帮助到某些人。我认为解开C#部分、正则表达式部分等等可能会相当困难。这篇文章似乎成为了负分的磁铁,但我想这种情况是经常发生的。 - JosephDoggie

19

尝试一下

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

\b匹配单词边界。点击这里获取更多详细信息。


11
你需要在词的前后加入零宽断言,以确保这个单词之前或之后的字符不是这个单词的一部分:
(?=(\W|^))(shoes|shirt|pants)(?!(\W|$))

正如其他人建议的那样,我认为使用\b可以代替(?=(\W|^))(?!(\W|$)),即使单词位于输入字符串的开头或结尾,但我不确定。


3
你的模式比使用"\b"更好,因为后者不会接收以逗号结尾("keyword,")的关键词,而这是可以预期的。另外,正确的模式是:(?<=\W|^)(keyword)(?=\W|$)。 - net_prog

3

使用\b元字符来在单词边界上进行匹配。


4
这确实提供了答案,尽管不是正则表达式。 - escist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接