Java patterns récupération des groupes
Résolu
ga
-
ga -
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
-
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());
} -
-
-
Salut,
ftp://ftp-developpez.com/cyberzoide/java/regex.pdf
Pages 17 à 23 du pdf obtenu...
Cordialement,
Dan