web-dev-qa-db-fra.com

Comptez le nombre de fois qu'une chaîne apparaît dans une chaîne

J'ai simplement une chaîne qui ressemble à ceci:

"7, vrai, NA, faux: 67, faux, NA, faux: 5, faux, NA, faux: 5, faux, NA, faux"

Tout ce que je veux faire, c'est compter combien de fois la chaîne "true" apparaît dans cette chaîne. J'ai l'impression que la réponse est quelque chose comme String.CountAllTheTimesThisStringAppearsInThatString() mais pour une raison quelconque, je ne peux pas le comprendre. Aidez-moi?

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

Probablement pas le plus efficace, mais pensez que c'est une bonne façon de le faire.

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

Votre expression régulière doit être \btrue\b pour contourner le problème de "mauvaise interprétation" soulevé par Casper. La solution complète ressemblerait à ceci:

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;

Assurez-vous que l'espace de noms System.Text.RegularExpressions est inclus en haut du fichier.

13
DonaldRay

Cela échouera cependant si la chaîne peut contenir des chaînes comme "miscontrue".

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

Ici, je vais sur-architecturer la réponse en utilisant LINQ. Montre simplement qu'il y a plus que 'n' façons de cuisiner un œuf:

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

Avec 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

faites cela, veuillez noter que vous devrez définir l'expression régulière pour '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
2
VoodooChild