【问题标题】:Regex.Match whole words正则表达式。匹配整个单词
【发布时间】:2010-11-15 14:15:58
【问题描述】:

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

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

我想在内容字符串中查找整个单词。我以为regex 会这样做:

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

但是对于像participants 这样的词它返回true,即使我只想要整个词pants

我如何只匹配那些字面意思?

【问题讨论】:

    标签: c# .net regex


    【解决方案1】:

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

    \b(shoes|shirt|pants)\b
    

    在代码中:

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

    【讨论】:

    • 你会怎么做但是忽略大小写
    • 在末尾添加, RegexOptions.IgnoreCase)
    • 注意括号在这种情况下是可选的,删除它们会简化结果
    【解决方案2】:

    试试

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

    \b 匹配单词边界。详情请见here

    【讨论】:

      【解决方案3】:

      你需要一个零宽度断言在单词之前或之后的字符不是单词的一部分:

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

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

      【讨论】:

      • 您的模式比使用“\b”要好,因为后者不会采用例如以逗号(“keyword”)结尾的关键字,而这是意料之中的。此外,正确的模式是: (?
      【解决方案4】:

      使用 \b 元序列在其上放置一个单词边界。

      【讨论】:

      • 这确实提供了答案,尽管不是正则表达式。
      猜你喜欢
      • 2012-01-06
      • 2011-08-07
      • 2017-07-08
      • 1970-01-01
      相关资源
      最近更新 更多