Java patterns récupération des groupes

[Résolu/Fermé]
Signaler
-
 ga -


Bonjour,

Je n'arrive pas à récupérer les groupes d'une chaîne : je n'obtiens que la dernière.

Je cherche la première lettre des groupes de majuscules de "ABcDEfGHi", soit A, D et G

Matcher m = Pattern.compile("^(?:([A-Z])[A-Z]*[\\.]*)*+").matcher("AB.DE.GH.");
if (m.matches()){
int findCount = 0;
do{
findCount++;
for (int i = 0; i < m.groupCount()+1; i++)
System.out.println("Find N°" + findCount + " - groupCount N°" + i + " - " + m.group(i));
}while (m.find());
}

J'obtiens :
Find N°1 - groupCount N°0 - AB.DE.GH.
Find N°1 - groupCount N°1 - G

2 réponses

Messages postés
16400
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
21 septembre 2021
2 879
Ton expression régulière est incorrecte, difficile d'expliquer tout ce qui est faux dedans, mais la plus grosse erreur est de spécifier une expression régulière pour toute la chaîne alors qu'elle doit représenter chacun des find.

Dans ton cas :

public static void main(String...args)
{
    String input = "ABcDEfGHi";
    String regex = "([A-Z])[A-Z]*[^A-Z]*";
    
    Matcher matcher = Pattern.compile(regex).matcher(input);
    
    for (int i=1; matcher.find(); i++)
        System.out.printf("%d : %s dans %s\n", i, matcher.group(1), matcher.group(0));
}
un grand merci à toi.
En fait j'avais déjà essayé de ne donner l'expression que pour le find, mais ça ne marchait pas à causes du test if (matches()).

Pour être bien clair pour tous les lecteurs :

- matches() ne retourne true que si la chaîne testée dans son intégralité matche l'expression régulière...

- pour tester qu'une portion seulement de la chaîne matche, il faut utiliser lookingAt() qui donne la première occurrence dand la chaîne

- le find() donne l'occurrence suivante

- le groupCount() est le nombre de groupes dans l'expression régulière, il est le même pour tous les find() trouvés.

- Enfin, le printf est plus élégant que le println.

Ce qui me donne au final :
Matcher m = Pattern.compile("([A-Z])[A-Z]*[\\.]*").matcher("AB.DE.GH.");

if (m.lookingAt()){
int findCount = 0;
do{
findCount++;
for (int i = 0; i < m.groupCount()+1; i++)
System.out.printf("\nFind N°%d - group N°%d - %s", findCount, i, m.group(i));
}while (m.find());
}
Excuse-moi, c'est ma première utilisation du forum, au lieu de te répondre, j'ai donné une nouvelle réponse...
Ta réponse m'a débloqué, je te remercie.

Salut,

ftp://ftp-developpez.com/cyberzoide/java/regex.pdf

Pages 17 à 23 du pdf obtenu...

Cordialement,

Dan
Merci beaucoup, le doc est très bien fait . Juste un petit manque pour la fonction lookingAt() qui m'a permis de tester la présence d'au-moins un match avant la boucle de find()