Lorsque l'expression régulière contient des groupes de capture, les occurrences trouvées se voient stockées dans des groupes, accessibles par la méthode group(int).

De la même façon, les positions de début et de fin d'une occurrence peuvent être récupérées en appelant respectivement les méthodes start(int) et end(int). Le nombre de groupes disponibles est fourni par la méthode groupCount()

Pattern modele = Pattern.compile("((a.)c)");
Matcher recherche = modele.matcher("abcxxxabcxxxabcxxx");
int compteur = 0;
while(recherche.find()) {
    compteur++;
    System.out.println("Une occurrence a été trouvée : " + compteur);
    int nombre = recherche.groupCount();
    if(nombre > 0) {
        for (int i = 0; i < nombre; i++) {
            int debut = recherche.start(i);
            int fin = recherche.end(i);
            String chaine = recherche.group(i);
            System.out.println(i + " " + chaine + " " + debut + " " + fin);
        }
    }
    else {
        int debut = recherche.start();
        int fin = recherche.end();
        String chaine = recherche.group();
        System.out.println(chaine + " " + debut + " " + fin);
    }
}
Resultats :
Une occurrence a été trouvée : 1
0 abc 0 3
1 abc 0 3
Une occurrence a été trouvée : 2
0 abc 6 9
1 abc 6 9
Une occurrence a été trouvée : 3
0 abc 12 15
1 abc 12 15
Exemple [voir]
private void rechercher() {
    try {
        if(this.fen.getTxtSource() != null 
        && !this.fen.getTxtSource().equals(Utilitaires.VIDE)
        && this.fen.getExpression() != null 
        && !this.fen.getExpression().equals(Utilitaires.VIDE)) {
            Pattern modele = Pattern.compile(this.fen.getExpression(), 
                     this.calculerOptions());
            Matcher recherche = modele.matcher(this.fen.getTxtSource());
            int compteur = 0;
            this.fen.initTable();
            this.fen.supprimerSelection();
            while(recherche.find()) {
                compteur++;
                int nombre = recherche.groupCount();
                if(nombre > 0) {
                    for (int i = 0; i < nombre; i++) {
                        int debut = recherche.start(i);
                        int fin = recherche.end(i);
                        String chaine = recherche.group(i);
                        this.afficher(
                                    compteur,
                                    i + 1,
                                    debut, 
                                    fin, 
                                    chaine);
                    }
                }
                else {
                    int debut = recherche.start();
                    int fin = recherche.end();
                    String chaine = recherche.group();
                    this.afficher(
                                compteur,
                                0,
                                debut, 
                                fin, 
                                chaine);
                }
            }
            this.fen.setLblTrouves(this.afficherTrouves(compteur));
            this.fen.ajouterSelection();
        }
    }
    catch(PatternSyntaxException e) {
        this.afficher(e);
    }
}
private void afficher(int compteur, int groupe, int debut, int fin, String chaine) {
    final String[] valeurs = new String[] {
                            String.valueOf(compteur),
                            groupe > 0 ? String.valueOf(groupe) : Utilitaires.VIDE, 
                            String.valueOf(debut), 
                            String.valueOf(fin), 
                            chaine};
    fen.getModele().addRow(valeurs);
}