Java patterns récupération des groupes

Résolu/Fermé
ga - 29 févr. 2012 à 12:13
 ga - 1 mars 2012 à 11:18


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
A voir également:

2 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
29 févr. 2012 à 18:46
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));
}
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());
}
0
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.
0
Utilisateur anonyme
29 févr. 2012 à 18:06
Salut,

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

Pages 17 à 23 du pdf obtenu...

Cordialement,

Dan
-1
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()
0