在字符串 C# 中查找子字符串的计数

Posted

技术标签:

【中文标题】在字符串 C# 中查找子字符串的计数【英文标题】:find Count of Substring in string C# 【发布时间】:2019-02-01 12:46:05 【问题描述】:

我试图找出“Serotonin”一词在收集的网络数据中出现了多少次,但找不到找到次数的方法。

IEnumerator OnMouseDown()



    string GatheredData;
    StringToFind = "Serotonin"

    string url = "https://en.wikipedia.org/wiki/Dopamine";

    WWW www = new WWW(url);
    yield return www;
    GatheredData = www.text;


    //Attempted methods below

    M1_count = GatheredData.Contains(StringToFind);

    M1_count = GatheredData.Count(StringToFind);

    M1_count = GatheredData.IndexOf(StringToFind);




当我告诉它索引中的数字和方法 2 可以使用但仅适用于字符而不是字符串时,我可以轻松地使用方法 1 和 3 中的数据

我已经在网上和这里查过,但没有找到 StringToFind 的计数

【问题讨论】:

GatheredData.IndexOf(string/char StringToFind,int starindex,int count); 哦,是的,位移方法……如果没有内置方法,那会起作用 首选索引,我怎么知道除了 indexof 之外还有多少直到 null?或者这就是方法? How to count of sub-string occurrences?的可能重复 How would you count occurrences of a string (actually a char) within a string?的可能重复 【参考方案1】:

哦,是的,我现在有了。

我将 split() 数组并获取长度

第二次,我将 IndexOf 直到我返回 -1

感谢 cmets 的帮助!

【讨论】:

这行得通,但上面的正则表达式解决方案要简单得多。【参考方案2】:

一个可能的解决方案是使用正则表达式:

var count = Regex.Matches(GatheredData.ToLower(), String.Format("\b0\b", StringToFind)).Count;

【讨论】:

您可能想改用Regex.Escape(StringToFind)。还可能值得一提的是\b 需要一个边界,所以SerotoninSerotonin 不会匹配,但Serotonin Serotonin 会匹配。在OP想要的情况下,我认为这没关系:) 没错,我的答案是他真正需要的 :) 但谢谢约翰!【参考方案3】:

假设字符串是这样的

string test = "word means collection of chars, and every word has meaning";

然后只需使用正则表达式来查找您的test 字符串中的单词匹配次数,如下所示

int count = Regex.Matches(test, "word").Count;

输出将是2

【讨论】:

我刚试过你的方法,效果很好,谢谢! 使用:Regex.Escape(str) 以确保它可以处理所有输入【参考方案4】:

解决方案 int count = Regex.Matches(someString, potencialSubstring).Count;

对我不起作用。即使你我用Regex.Escape(str)

所以我自己写的,速度很慢,但在我的应用中性能不是问题。

private static List<int> StringOccurencesCount(String haystack, String needle, StringComparison strComp)

  var results = new List<int>();
  int index = haystack.IndexOf(needle, strComp);
  while (index != -1)
  
    results.Add(index);
    index = haystack.IndexOf(needle, index + needle.Length, strComp);
  
  return results;

也许有人会觉得这很有用。

【讨论】:

恭喜,您刚刚发明了方轮;-) 正则表达式解决方案有效,但“potencialSubstring”是正则表达式模式。 Matches (string input, string pattern);Regex.Escape 不会转义所有可能的字符。如果你想要一个替代方案,为什么不使用string.Split,那么你不需要转义你的potencialSubstring。【参考方案5】:

改进@Petr Nohejl 的出色答案:

public static int Count (this string s, string substr, StringComparison strComp = StringComparison.CurrentCulture)

    int count = 0, index = s.IndexOf(substr, strComp);
    while (index != -1)
    
        count++;
        index = s.IndexOf(substr, index + substr.Length, strComp);
    
    return count;

这不使用Regex.Matches 并且可能具有更好的性能并且更可预测。

See on .NET Fiddle

【讨论】:

以上是关于在字符串 C# 中查找子字符串的计数的主要内容,如果未能解决你的问题,请参考以下文章

子字符串计数

C# 在表示字符串的大字节数组中寻找子数组

字符串查找目标子串出现的次数

在 C# 中的某个字符串之后提取子字符串 [关闭]

C#:如何查找两个字符串数组是不是包含相同的值

字符串中的子字符串计数