在一个字符串中统计另一个字符串出现的次数

66

我有一个类似于这样的字符串:

"7,true,NA,false:67,false,NA,false:5,false,NA,false:5,false,NA,false"

我想做的是计算字符串中出现 "true" 的次数。我感觉答案应该是像 String.CountAllTheTimesThisStringAppearsInThatString() 这样,但出于某种原因我就是想不出来。请帮帮忙?


2
https://dev59.com/ZXRB5IYBdhLWcg3wtZMV#542136 - jball
8
@jball,我认为那里提供的所有解决方案都是用于计算 字符 出现次数的。 - AakashM
5
很高兴你没有为微软工作,可以自己命名方法名! - user3791372
1
这些相关问题(“此问题已有答案:”)大多数都是关于计算多个字符出现次数的答案,而不是多个子字符串出现次数的答案。 - Alex P.
1
这些相关问题(“此问题已有答案:”)主要是关于计算多个字符出现次数的答案,而不是计算多个子字符串出现次数的答案。 - undefined
显示剩余2条评论
7个回答

210
Regex.Matches(input, "true").Count

2
仅基于简洁性 - 你赢了 ;) - Paul Mignard
1
C#字符串中没有匹配项。糟糕。正则表达式。没关系。 - xarzu
1
为什么我们要转义 input,它不是正则表达式啊? - tpower
@tpower,我也有同样的问题。我研究了Regex.Escape并在LINQPad中运行了测试以确认。我编辑了编辑内容以删除它。 - Chris Benard

17

可能不是最有效的方法,但我认为这是一个很好的做法。

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(CountAllTheTimesThisStringAppearsInThatString("7,true,NA,false:67,false,NA,false:5,false,NA,false:5,false,NA,false", "true"));
        Console.WriteLine(CountAllTheTimesThisStringAppearsInThatString("7,true,NA,false:67,false,NA,false:5,false,NA,false:5,false,NA,false", "false"));

    }

    static Int32 CountAllTheTimesThisStringAppearsInThatString(string orig, string find)
    {
        var s2 = orig.Replace(find,"");
        return (orig.Length - s2.Length) / find.Length;
    }
}

3
哈哈 - 我应该把你的标记为正确的,因为你使用了我的建议的方法名称。 :) Translated: 哈哈 - 我应该将你的回答标记为正确,因为你使用了我提出的方法名。 :) - Paul Mignard

14

你的正则表达式应该是\btrue\b,以解决Casper提出的“miscontrue”问题。完整的解决方案如下:

你的正则表达式应该是\btrue\b,以解决Casper提出的“miscontrue”问题。完整的解决方案如下:

string searchText = "7,true,NA,false:67,false,NA,false:5,false,NA,false:5,false,NA,false";
string regexPattern = @"\btrue\b";
int numberOfTrues = Regex.Matches(searchText, regexPattern).Count;

确保在文件顶部包含了System.Text.RegularExpressions命名空间。


1
字符串变量不应该被称为Regex - 它会与.NET Regex类名称本身发生冲突。 - JustAMartin

5

如果字符串可能包含像 "miscontrue" 这样的字符串,则此方法将失败。

   Regex.Matches("7,true,NA,false:67,false,NA,false:5,false,NA,false:5,false,NA,false", "true").Count;

4

这里,我将使用LINQ来过度设计回答。这只是展示了煮鸡蛋的方法不止一种:

public int countTrue(string data)
{
    string[] splitdata = data.Split(',');

    var results = from p in splitdata
            where p.Contains("true")
            select p;

    return results.Count();
}

谢谢,它工作得很好,而且还很智能 :) - Syed Mohamed

3

With Linq...

string s = "7,true,NA,false:67,false,NA,false:5,false,NA,false:5,false,NA,false";
var count = s.Split(new[] {',', ':'}).Count(s => s == "true" );

2

请注意,您需要为“test”定义正则表达式才能执行此操作!

string s = "7,true,NA,false:67,false,NA,false:5,false,NA,false:5,false,NA,false";
string[] parts = (new Regex("")).Split(s);
//just do a count on parts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接