2010-02-10 14 views
8

¿Hay alguna forma de tener una expresión entre paréntesis no ser atrapado en un grupo?Numeración de grupos con bloques opcionales en una expresión regular

E.g. tengo una expresión algo como esto:

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

Tomar nota de los bloques opcionales (B|C)? y (F|G)? soportes que necesitan.
No me interesa lo que se atrapó en estos grupos. Todo lo que quiero es atrapar el primer y último bloque completo.

Pero debido a los bloques opcionales, la numeración grupo va a cambiar y no puedo decir si (E(F|G)?) fue capturado en el grupo 2 o 3.

puedo saber la expresión de ignorar las partes opcionales en los grupos de resultados , entonces la numeración del grupo seguirá siendo la misma? ¿O puedo hacer que las capturas opcionales siempre aparezcan en grupos, incluso cuando son nulas?

Respuesta

15

(E(F|G)?) siempre será capturado como el grupo 3. La numeración se determina por el orden de apertura de paréntesis en la cadena de patrón, que es:

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

Si (B|C) no se produce en la cadena de entrada entonces group(2) voluntad devuelve nulo, pero los grupos subsiguientes no serán renumerados.

Los únicos grupos que no influyen en la numeración son los grupos que no capturan, p.

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

Ejemplo:

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)); 
} 

Salida:

A 
null 
EG 
G 
+0

Tienes razón. Aparentemente, me indujo a error mi eclipse de complemento QuickREx, que solo mostraba 3 grupos (pero con el índice 1, 3 y 4). Pero el bit que no captura sigue siendo muy útil para reducir el ruido. – Stroboskop

9

hay grupos no capturar (?:…):

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

no se puede hacer referencia El partido de tal grupo.

Cuestiones relacionadas