Saltar al contenido principal

Grupos

Dentro de las expresiones regulares, los grupos se indican con paréntesis y, cuando se definen, es posible extraer el valor con el que tienen una coincidencia.

Por ejemplo, modifiquemos el primer ejemplo visto utilizando grupos. Si lo que queremos extraer son los números, pongamos la expresión regular que coincide con los números de teléfono entre paréntesis:

([0-9]{9})

Veamos el código completo:

String str = "Puedes llamar a nuestra tienda de Santiago al teléfono 981002233 de 9:00h a 12:00h" +
"o a nuestra tienda de Vigo al teléfono 986009988 de 16:30h a 23:00h.";

// Se han añadido unos paréntesis para definir el grupo.
Pattern pattern = Pattern.compile("([0-9]{9})");
Matcher matcher = pattern.matcher(str);

while(matcher.find()) {
String match = matcher.group(1); // Extraer coincidencia.
System.out.println(match); // Mostrar coincidencia.
}

El código anterior muestra:

981002233
986009988

Lo mismo ocurre con las horas:

String str = "Puedes llamar a nuestra tienda de Santiago al teléfono 981002233 de 9:00h a 12:00h" +
"o a nuestra tienda de Vigo al teléfono 986009988 de 16:30h a 23:00h.";

// Se han añadido unos paréntesis para definir el grupo.
Pattern pattern = Pattern.compile("([0-9]{1,2}:[0-9]{2}h)");
Matcher matcher = pattern.matcher(str);

while(matcher.find()) {
String match = matcher.group(1); // Extraer coincidencia.
System.out.println(match); // Mostrar coincidencia.
}

El código anterior muestra:

9:00h
12:00h
16:30h
23:00h

Es importante tener en cuenta que tenemos que encerrar entre paréntesis aquello que deseamos extraer: no tiene por qué coincidir el patrón que queremos buscar con lo que queremos extraer. Si, por ejemplo, queremos buscar los números de teléfono y extraer únicamente su prefijo, tendríamos que utilizar la siguiente expresión:

([0-9]{3})[0-9]{6}

Explicación:

ParteDescripción
([0-9]{3})Grupo de 3 cifras consecutivas. Coinciden con el prefijo.
[0-9]{6}6 cifras consecutivas.

Con esta expresión, buscamos en el texto 9 cifras consecutivas (3 + 6) y extraemos solo aquellas que hemos definido en un grupo (que están entre paréntesis). Veamos el código:

String str = "Puedes llamar a nuestra tienda de Santiago al teléfono 981002233 de 9:00h a 12:00h" +
"o a nuestra tienda de Vigo al teléfono 986009988 de 16:30h a 23:00h.";

Pattern pattern = Pattern.compile("([0-9]{3})[0-9]{6}");
Matcher matcher = pattern.matcher(str);

while(matcher.find()) {
String match = matcher.group(1); // Extraer coincidencia.
System.out.println(match); // Mostrar coincidencia.
}

El código anterior muestra:

981
986

Para el segundo ejemplo, si queremos extraer las horas que hay en el texto, pero quedándonos únicamente con lo que está antes de la "h", podemos hacerlo con la siguiente expresión:

([0-9]{1,2}:[0-9]{2})h

Como se puede apreciar, encerramos entre paréntesis solo aquello que queremos extraer (excluimos la "h").

Veamos el código completo:

String str = "Puedes llamar a nuestra tienda de Santiago al teléfono 981002233 de 9:00h a 12:00h" +
"o a nuestra tienda de Vigo al teléfono 986009988 de 16:30h a 23:00h.";

Pattern pattern = Pattern.compile("([0-9]{1,2}:[0-9]{2})h");
Matcher matcher = pattern.matcher(str);

while(matcher.find()) {
String match = matcher.group(1); // Extraer coincidencia.
System.out.println(match); // Mostrar coincidencia.
}

El código anterior muestra:

9:00
12:00
16:30
23:00

Se pueden definir varios grupos en un código: solo hay que poner tantos paréntesis como grupos se deseen.

¿Cómo podríamos diferenciar las horas extraídas entre hora de apertura y hora de cierre? Si analizamos el texto con el que estamos trabajando, vemos que las horas aparecen reflejadas de la siguiente forma:

<hora apertura> a <hora cierre>

donde <hora apertura> y <hora cierre> coinciden con el patrón:

[0-9]{1,2}:[0-9]{2}h

Hemos visto que, para extraer las horas, debemos poner lo que deseamos extraer entre paréntesis, es decir:

([0-9]{1,2}:[0-9]{2}h)

Ahora, si queremos entraer dos horas que van seguidas, deberíamos duplicar esa expresión:

([0-9]{1,2}:[0-9]{2}h)([0-9]{1,2}:[0-9]{2}h)

La expresión anterior no va a funciona porque entre la hora de apertura y la de cierre hay texto: un espacio, una "a" y otro espacio. Para ello, debemos añadir lo siguiente:

\s+a\s+

Si juntamos todo, tenemos:

([0-9]{1,2}:[0-9]{2}h)\s+a\s+([0-9]{1,2}:[0-9]{2}h)
ParteDescripción
([0-9]{1,2}:[0-9]{2}h)Hora. Por ejemplo: 9:30h o 13:00h.
\s+Uno o más espacios.
aLa letra "a".
\s+Uno o más espacios.
([0-9]{1,2}:[0-9]{2}h)Hora. Por ejemplo: 9:30h o 13:00h.

El código completo sería el siguiente:

String str = "Puedes llamar a nuestra tienda de Santiago al teléfono 981002233 de 9:00h a 12:00h" +
"o a nuestra tienda de Vigo al teléfono 986009988 de 16:30h a 23:00h.";

// NOTA: como la barra invertida (\) es un carácter reservado, si la queremos utilizar, debemos
// introducirla dos veces (\\). Es por ello que se muestra \\s+ en lugar de \s+.
Pattern pattern = Pattern.compile("([0-9]{1,2}:[0-9]{2})h\\s+a\\s+([0-9]{1,2}:[0-9]{2})h");
Matcher matcher = pattern.matcher(str);

while(matcher.find()) {
String match1 = matcher.group(1); // Extraer coincidencia 1.
String match2 = matcher.group(2); // Extraer coincidencia 2.
System.out.println("Hora de apertura: " + match1);
System.out.println("Hora de cierre: " + match2);
}

El código anterior muestra:

Hora de apertura: 9:00h
Hora de cierre: 12:00h
Hora de apertura: 16:30h
Hora de cierre: 23:00h