【问题标题】:Check if string contains substring more than once检查字符串是否多次包含子字符串
【发布时间】:2013-02-05 18:09:56
【问题描述】:

要在字符串中搜索子字符串,我可以使用contains() 函数。 但是如何检查一个字符串是否多次包含子字符串?

优化:对我来说,知道结果不止一个就足够了。

【问题讨论】:

标签: c# search


【解决方案1】:

尝试利用快速的IndexOfLastIndexOf 字符串方法。使用下一个代码 sn-p。想法是检查第一个和最后一个索引是否不同,如果第一个索引不是-1,这意味着字符串存在。

string s = "tytyt";

var firstIndex = s.IndexOf("tyt");

var result = firstIndex != s.LastIndexOf("tyt") && firstIndex != -1;

【讨论】:

  • 我喜欢这个。不会给你计数,但会告诉你 contains 是复数。
  • @Lloyd 如果你想搜索count - 算法会慢得多。
  • 很好的例子"tytyt",因为它表明两个子字符串出现重叠是可能的。检查两个不重叠的子字符串出现是另一回事。
  • 最好按照复杂程度排列(a && b && ...),我相信firstIndex != -1首先会在为false时使其短路,并且可能会保存一些LastIndexOf()调用。
【解决方案2】:

您可以使用以下使用string.IndexOf的扩展方法:

public static bool ContainsMoreThan(this string text, int count, string value,  StringComparison comparison)
{
    if (text == null) throw new ArgumentNullException("text");
    if (string.IsNullOrEmpty(value))
        return text != "";

    int contains = 0;
    int index = 0;

    while ((index = text.IndexOf(value, index, text.Length - index, comparison)) != -1)
    {
        if (++contains > count)
            return true;
        index++;
    }
    return false;
}

按以下方式使用:

string text = "Lorem ipsum dolor sit amet, quo porro homero dolorem eu, facilisi inciderint ius in.";
bool containsMoreThanOnce = text.ContainsMoreThan(1, "dolor", StringComparison.OrdinalIgnoreCase); // true

Demo

它是一个字符串扩展,可以传递count、你搜索的valueStringComparison(例如不区分大小写的搜索)。

【讨论】:

  • 您可能需要使用index + 1 来避免两次找到相同的子字符串。
  • @JeppeStigNielsen:但我已经在使用index + 1(好吧,我的第一个版本没有)
  • 是的,我评论时没有看到您的编辑。也许如果toSearch 只有Length 一个,并且第一次(也是唯一一次)出现在text 的最后,那么您对IndexOf 的最后一次调用将引发异常。
  • @JeppeStigNielsen:不,恕我直言,这是免费的。但是,现在我已将其作为扩展程序并以多种方式对其进行了改进。
  • 现在很酷(赞成)。我想如果你搜索一个长度为 1 的字符串并且最后找到它,它会失败,但我试了一下,它只失败了空字符串。使用您的新代码,调用 "Hello".ContainsMoreThan(100, "", StringComparison.Ordinal); 会引发“错误”异常。是的,当然,搜索空字符串是非常有意义的,但是如果你不知道字符串是空的,就会发生这种情况。
【解决方案3】:
private bool MoreThanOnce(string full, string part)
{
   var first = full.IndexOf(part);
   return first!=-1 && first != full.LastIndexOf(part);
}

【讨论】:

    【解决方案4】:

    您也可以使用 Regex 类。 msdn regex

       int count;
       Regex regex = new Regex("your search pattern", RegexOptions.IgnoreCase);
       MatchCollection matches = regex.Matches("your string");
       count = matches.Count;
    

    【讨论】:

      【解决方案5】:

      正则表达式的一行代码:

      return Regex.Matches(myString, "test").Count > 1;
      

      【讨论】:

        猜你喜欢
        • 2011-11-09
        • 2013-05-18
        • 2021-12-20
        • 2014-06-25
        • 2014-11-22
        • 1970-01-01
        • 2021-12-14
        • 2013-03-04
        • 2014-12-10
        相关资源
        最近更新 更多