Comment compter le nombre de correspondances pour une expression régulière?

1. Vue d'ensemble

Les expressions régulières peuvent être utilisées pour une variété de tâches de traitement de texte, telles que des algorithmes de comptage de mots ou la validation des entrées de texte.

Dans ce didacticiel, nous verrons comment utiliser des expressions régulières pour compter le nombre de correspondances dans un texte .

2. Cas d'utilisation

Développons un algorithme capable de compter combien de fois un e-mail valide apparaît dans une chaîne .

Pour détecter une adresse e-mail, nous utiliserons un modèle d'expression régulière simple:

([a-z0-9_.-]+)@([a-z0-9_.-]+[a-z])

Notez qu'il s'agit d'un modèle trivial à des fins de démonstration uniquement, car le regex réel pour faire correspondre des adresses e-mail valides est assez complexe.

Nous aurons besoin de cette expression régulière dans un objet Pattern afin de pouvoir l'utiliser:

Pattern EMAIL_ADDRESS_PATTERN = Pattern.compile("([a-z0-9_.-]+)@([a-z0-9_.-]+[a-z])");

Nous examinerons deux approches principales, dont l'une dépend de l'utilisation de Java 9 ou version ultérieure.

Pour notre exemple de texte, nous allons essayer de trouver les trois e-mails dans la chaîne:

"You can contact me through [email protected], [email protected], and [email protected]"

3. Comptage des correspondances pour Java 8 et les versions antérieures

Tout d'abord, voyons comment compter les correspondances en utilisant Java 8 ou une version antérieure.

Un moyen simple de compter les correspondances consiste à parcourir la méthode find de la classe Matcher . Cette méthode tente de trouver la sous-séquence suivante de la séquence d'entrée qui correspond au modèle :

Matcher countEmailMatcher = EMAIL_ADDRESS_PATTERN.matcher(TEXT_CONTAINING_EMAIL_ADDRESSES); int count = 0; while (countEmailMatcher.find()) { count++; }

En utilisant cette approche, nous trouverons trois correspondances, comme prévu:

assertEquals(3, count);

Notez que la méthode find ne réinitialise pas le Matcher après chaque correspondance trouvée - elle reprend à partir du caractère après la fin de la séquence précédente correspondante, donc cela ne fonctionnerait pas pour trouver des adresses e-mail qui se chevauchent.

Par exemple, considérons cet exemple:

String OVERLAPPING_EMAIL_ADDRESSES = "Try to contact us at [email protected]@baeldung.com, [email protected]"; Matcher countOverlappingEmailsMatcher = EMAIL_ADDRESS_PATTERN.matcher(OVERLAPPING_EMAIL_ADDRESSES); int count = 0; while (countOverlappingEmailsMatcher.find()) { count++; } assertEquals(2, count);

Quand l'expression régulière essaie de trouver des correspondances dans la chaîne donnée , elle trouve d'abord «[email protected]» comme correspondance. Puisqu'il n'y a aucune partie de domaine précédant le @, le marqueur ne sera pas réinitialisé et le deuxième «@ baeldung.com» sera ignoré. Ensuite, il considérera également «[email protected]» comme deuxième correspondance:

Comme indiqué ci-dessus, nous n'avons que deux correspondances dans l'exemple d'e-mail qui se chevauchent.

4. Comptage des correspondances pour Java 9 et versions ultérieures

Cependant, si nous avons une version plus récente de Java disponibles, nous pouvons utiliser les résultats méthode de la matcher classe. Cette méthode, ajoutée dans Java 9, retourne un flux séquentiel de résultats de correspondance, nous permettant de compter les correspondances plus facilement:

long count = countEmailMatcher.results() .count(); assertEquals(3, count);

Comme nous l'avons vu avec find , le Matcher n'est pas réinitialisé lors du traitement du flux à partir de la méthode des résultats . De même, la méthode des résultats ne fonctionnerait pas non plus pour trouver des correspondances qui se chevauchent.

5. Conclusion

Dans ce court article, nous avons appris à compter les correspondances d'une expression régulière.

Tout d' abord, nous avons appris à utiliser la découverte méthode avec en boucle. Ensuite, nous avons vu comment la nouvelle méthode de streaming Java 9 nous permet de faire cela avec moins de code.

Comme toujours, les exemples de code sont disponibles à l'adresse over sur GitHub.