【问题标题】:C# find exact-match in stringC# 在字符串中查找完全匹配
【发布时间】:2015-12-09 23:31:49
【问题描述】:

如何在字符串中搜索完全匹配?例如,如果我有一个包含此文本的字符串:

标签
标签:
标签

我搜索标签,我只想得到第一个匹配,而不是其他两个。我尝试了 Contains 和 IndexOf 方法,但它们也给了我第二个和第三个匹配项。

【问题讨论】:

  • 你为什么不检查str == "label"
  • 他正在寻找“全词”搜索.. :)

标签: c# string find exact-match


【解决方案1】:

你可以像这样使用正则表达式:

bool contains = Regex.IsMatch("Hello1 Hello2", @"(^|\s)Hello(\s|$)"); // yields false
bool contains = Regex.IsMatch("Hello1 Hello", @"(^|\s)Hello(\s|$)"); // yields true

\b 是一个单词边界检查,像上面一样使用它只能匹配整个单词。

认为正则表达式版本应该比 Linq 更快。

Reference

【讨论】:

  • 由于某种原因,这不起作用。不管我写什么,它总是正确的。
  • 你一定做错了什么,因为我检查过它并且它运行良好。也许你可以发布你说它总是返回 true 的代码。
  • 好的,显然 string reg = (@"\bHello\b");有效,但字符串 reg = (@"\b" + label + @"\b");才不是。为什么会这样,我该如何解决?
  • 好的,所以显然我已经意识到下面的代码没有考虑冒号,所以即使我写了Hello仍然会返回true:
  • 试试这个:reg = ("\\b"+label+"\\b");没有“@”
【解决方案2】:

您可以尝试拆分字符串(在这种情况下,正确的分隔符可以是空格,但视情况而定),然后您可以使用 equals 方法查看是否匹配,例如:

private Boolean findString(String baseString,String strinfToFind, String separator)
{                
    foreach (String str in baseString.Split(separator.ToCharArray()))
    {
        if(str.Equals(strinfToFind))
        {
            return true;
        }
    }
    return false;
}

而且用途可以

findString("Label label Labels:", "label", " ");

【讨论】:

    【解决方案3】:

    您的单词之间似乎有一个分隔符 (crlf),因此您可以将分隔符作为搜索字符串的一部分。

    如果不是,我会接受 Liviu 的建议。

    【讨论】:

      【解决方案4】:

      你可以试试 LINQ 版本:

      string str = "Hello1 Hello Hello2";
      string another = "Hello";
      string retVal = str.Split(" \n\r".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
                         .First( p => p .Equals(another));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-12
        • 1970-01-01
        • 2015-09-02
        • 1970-01-01
        • 1970-01-01
        • 2013-05-21
        • 1970-01-01
        • 2020-09-04
        相关资源
        最近更新 更多