J'ai un
Regex.Matches(string, "word1").Count
Je veux compter les occurrences de mot1 + les occurrences de mot2 + les occurrences de mot3 dans une chaîne.
J'ai essayé
public static string[] words = {"word1","word2","word3"};
qui fonctionne bien pour un seul mot mais je ne sais pas comment rechercher toutes les chaînes. Je ne veux pas utiliser foreach car le tableau "words" peut contenir jusqu'à 25 chaînes. Merci.
3 Réponses :
Vous pouvez utiliser System.Linq
pour obtenir la Somme
du Count
de tous les Matches
en faisant quelque chose comme:
private static void Main() { var words = new[] {"dog", "coyote", "fox"}; var input = "The quick brown fox jumps over the lazy dog"; var wordCount = words.Sum(word => Regex.Matches(input, word).Count); // wordCount = 2 }
Merci beaucoup. C'est tout ce que je veux.
@ Claudinho18 Alors pourquoi avez-vous dit que vous ne vouliez pas faire cela dans la question?
Je pensais que cette approche était plus rapide que foreach classique.
Votre meilleure option, peut-être la seule, est une boucle qui parcourt la liste de mots.
Ma préférence est quelque chose comme ceci:
int intTotalWordCount=0; for (int intJ=0;intJ<words.Length;intJ++) { intTotalWordCount+=Regex.Matches(string, words[intJ]).Count; } Console.WriteLine (@"Final word count = {0}",intTotalWordCount;
Bien sûr, vous pourrait aussi bien envelopper le bloc ci-dessus dans une méthode qui a intTotalWordCount comme valeur de retour.
C'est une façon plus polyvalente de faire cela.
Regex vous donne plus de contrôle sur le contexte des mots trouvés.
Et je suppose que c'est beaucoup plus rapide, car il fait tout en un seul coup
sans beaucoup de manipulation de primitives.
string[] words = { "word1", "word2", "word3" }; Regex rx = new Regex( @"(?is)(?:.*?\b(" + string.Join("|", words) + @")\b)+"); string strin = "There are some word3 and more words and word1 and more word3, again word1"; Match m = rx.Match( strin ); if ( m.Success ) Console.WriteLine("Found {0} words", m.Groups[1].Captures.Count);
Sortie
4 mots trouvés
L'expression régulière ci-dessus utilise le mot frontière \ b
.
Autre choix de limite: Espace blanc (?
C'est beaucoup plus rapide que d'utiliser Regex.Matches () qui est plus lent que la saleté.
Vous devrez utiliser une sorte de boucle. Foreach n'est guère le pire d'entre eux.
Je veux compter tous les mots du tableau. Je me fiche des comptes individuels.
Je joindrais tous les mots du tableau avec le caractère d'alternance
|
, l'entourerais de parenthèses, puis l'entourerais de la limite du mot, c'est-à-dire\ b (mot1 | mot2 | mot3 | ..) \ b
puis utilisez une fonction de type findall globale. La taille du tableau vous indiquera le nombre. Ou vous pouvez simplement faire une seule correspondance en utilisant(? S) (?:. *? \ B (mot1 | mot2 | mot3 | ..) \ b) +
, puis obtenir la taille de la collection de capture groupe 1, même décompte.