web-dev-qa-db-ja.com

文字列内に文字列が現れる回数を数える

次のような文字列があります。

「7、true、NA、false:67、false、NA、false:5、false、NA、false:5、false、NA、false」

私がやりたいのは、文字列「true」が文字列に何回現れるかを数えることです。私は答えがString.CountAllTheTimesThisStringAppearsInThatString()のようなものだと感じていますが、何らかの理由でそれを理解できません。助けて?

53
onekidney
Regex.Matches(input, "true").Count
168
µBio

おそらく最も効率的ではありませんが、それを行うにはきちんとした方法だと思います。

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;
    }
}
14
rjdevereux

正規表現は\btrue\bキャスパーが提起する「誤解」問題を回避するため。完全なソリューションは次のようになります。

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名前空間がファイルの先頭に含まれていることを確認してください。

13
DonaldRay

ただし、文字列に「miscontrue」などの文字列を含めることができる場合、これは失敗します。

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

ここでは、LINQを使用して答えを過剰に設計します。卵を調理する「n」以上の方法があることを示しています。

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

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

    return results.Count();
}
3
Robaticus

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" );
3
Jace Rhea

これを行うには、「テスト」の正規表現を定義する必要があることに注意してください!!!

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
2
VoodooChild