2010-02-10 2 views
8

Existe-t-il un moyen d'avoir une expression entre parenthèses et non être pris dans un groupe?Numérotation de groupes avec des blocs facultatifs dans une expression régulière

E.g. J'ai une expression quelque chose comme ceci:

(A(B|C)?) D (E(F|G)?) 

Prenez note des blocs optionnels (B|C)? et (F|G)? supports besoin.
Je ne suis pas intéressé par ce qui a été pris dans ces groupes. Tout ce que je veux, c'est attraper le premier et le dernier bloc.

Mais en raison des blocs en option, la numérotation du groupe va changer et je ne peux pas dire si (E(F|G)?) a été pris dans le groupe 2 ou 3.

Puis-je dire l'expression d'ignorer les parties facultatives dans les groupes de résultats , donc la numérotation des groupes restera la même? Ou puis-je faire des captures optionnelles toujours apparaître dans les groupes - même si elles sont nulles?

Répondre

15

(E(F|G)?) sera toujours pris en groupe 3. La numérotation est déterminée par l'ordre de parenthèses ouverture dans la chaîne de motif, qui est:

(A(B|C)?) D (E(F|G)?) 
^^  ^^ 
1 2   3 4 

Si (B|C) ne se produit pas dans la chaîne d'entrée puis group(2) sera renvoie null, mais les groupes suivants ne seront pas renumérotés.

Les seuls groupes qui n'influencent pas la numérotation sont les groupes sans capture, par ex.

(A(?:B|C)?) D (E(?:F|G)?) 
^   ^
1    2 

Exemple:

Pattern pattern = Pattern.compile("(A(B|C)?) D (E(F|G)?)"); 
Matcher matcher = pattern.matcher("A D EG"); 
if (matcher.matches()) { 
    System.err.println(matcher.group(1)); 
    System.err.println(matcher.group(2)); 
    System.err.println(matcher.group(3)); 
    System.err.println(matcher.group(4)); 
} 

Sortie:

A 
null 
EG 
G 
+0

Vous avez raison. Apparemment, j'ai été induit en erreur par mon plug-in eclipse QuickREx, qui ne montrait que 3 groupes (mais avec les index 1, 3 et 4). Mais le bit non-capturant est toujours très utile pour réduire le bruit. – Stroboskop

9

Il y a des groupes non-capture (?:…):

(A(?:B|C)?) D (E(?:F|G)?) 

Le match d'un tel groupe ne peut pas être référencé.

Questions connexes