101 votes

Comment compter le nombre d'occurrences de sous-chaînes dans une chaîne (et non pas le nombre d'occurrences de caractères)

Supposons que j'ai une chaîne de caractères comme:

MyString = "OU=Level3,OU=Level2,OU=Level1,DC=domain,DC=com";

alors je veux savoir combien de fois la sous-chaîne "OU=" apparaît dans cette chaîne. Avec un seul caractère, il y a peut-être quelque chose comme:

int count = MyString.Split("OU=").Length - 1;

mais Split ne fonctionne que pour un char, pas pour une string.

Aussi comment trouver la position des n occurrences? Par exemple, la position du 2ème "OU=" dans la chaîne?

Comment résoudre ce problème?

223voto

tnw Points 5408
Regex.Matches(input, "OU=").Count

22voto

Jim Mischel Points 68586

Vous pouvez trouver toutes les occurrences et leurs positions avec IndexOf:

string MyString = "OU=Level3,OU=Level2,OU=Level1,DC=domain,DC=com";
string stringToFind = "OU=";

List positions = new List();
int pos = 0;
while ((pos < MyString.Length) && (pos = MyString.IndexOf(stringToFind, pos)) != -1)
{
    positions.Add(pos);
    pos += stringToFind.Length();
}

Console.WriteLine("{0} occurrences", positions.Count);
foreach (var p in positions)
{
    Console.WriteLine(p);
}

Vous pouvez obtenir le même résultat avec une expression régulière:

var matches = Regex.Matches(MyString, "OU=");
Console.WriteLine("{0} occurrences", matches.Count);
foreach (var m in matches)
{
    Console.WriteLine(m.Index);
}

Les principales différences:

  • Le code Regex est plus court
  • Le code Regex alloue une collection et plusieurs chaînes de caractères.
  • Le code IndexOf pourrait être écrit pour afficher la position immédiatement, sans créer de collection.
  • Il est probable que le code Regex sera plus rapide en isolation, mais s'il est utilisé de nombreuses fois, le surcoût combiné des allocations de chaînes de caractères pourrait entraîner une charge beaucoup plus élevée sur le collecteur de déchets.

Si j'écrivais ceci en ligne, comme quelque chose qui n'était pas souvent utilisé, je choisirais probablement la solution regex. Si je devais le mettre dans une bibliothèque comme quelque chose à utiliser souvent, je choisirais probablement la solution IndexOf.

13voto

fubo Points 647

Cette extension nécessite moins de ressources que les expressions régulières.

public static int CountSubstring(this string text, string value)
{                  
    int count = 0, minIndex = text.IndexOf(value, 0);
    while (minIndex != -1)
    {
        minIndex = text.IndexOf(value, minIndex + value.Length);
        count++;
    }
    return count;
}

utilisation:

MyString = "OU=Level3,OU=Level2,OU=Level1,DC=domain,DC=com";
int count = MyString.CountSubstring("OU=");

3voto

AmitApollo Points 5041

Ci-dessous devrait fonctionner

  MyString = "OU=Level3,OU=Level2,OU=Level1,DC=domain,DC=com";
  int count = Regex.Matches(MyString, "OU=").Count

2voto

Phil Points 19299
int count = myString.Split(new []{','})
                    .Count(item => item.StartsWith(
                        "OU=", StringComparison.OrdinalIgnoreCase))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X