【问题标题】:Regex.Match whole wordsRegex.Match整个单词
【发布时间】:2023-01-09 20:37:40
【问题描述】:

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】:

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

    (shoes|shirt|pants)
    

    在代码中:

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

    【讨论】:

    • 你会怎么做,但忽略大小写
    • 在最后添加一个, RegexOptions.IgnoreCase)
    • 请注意,在这种情况下括号是可选的,删除它们会简化结果
    • @ 是干什么用的?它似乎是字面意思,虽然我认为 |被解释为 OR 运算符而不是实际的 |特点。除非 @ 在那里,否则这似乎也行不通。真的吗?
    • @JosephDoggie 这意味着字符串中的反斜杠不应被解释为转义字符,而是字符串的一部分。
    【解决方案2】:

    尝试

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

    匹配单词边界。有关详细信息,请参阅here

    【讨论】:

      【解决方案3】:

      您需要在任何一侧进行零宽度断言,即单词之前或之后的字符不是单词的一部分:

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

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

      【讨论】:

      • 您的模式比使用“”更好,因为后者不会采用例如以逗号(“关键字,”)结尾的关键字,而这是预期的。此外,正确的模式是:(?<=W|^)(keyword)(?=W|$)
      【解决方案4】:

      使用元序列在其上设置单词边界。

      【讨论】:

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