Java Language Utilizando grupos de captura


Ejemplo

Si necesita extraer una parte de la cadena de la cadena de entrada, podemos usar grupos de captura de expresiones regulares.

Para este ejemplo, comenzaremos con una expresión regular de número de teléfono simple:

\d{3}-\d{3}-\d{4}

Si se agregan paréntesis a la expresión regular, cada conjunto de paréntesis se considera un grupo de captura . En este caso, estamos usando lo que se llama grupos de captura numerados:

(\d{3})-(\d{3})-(\d{4})
^-----^ ^-----^ ^-----^
Group 1 Group 2 Group 3

Antes de que podamos usarlo en Java, no debemos olvidar seguir las reglas de las Cadenas, escapando de las barras invertidas, resultando en el siguiente patrón:

"(\\d{3})-(\\d{3})-(\\d{4})"

Primero necesitamos compilar el patrón de expresiones regulares para hacer un Pattern y luego necesitamos un Matcher para hacer coincidir nuestra cadena de entrada con el patrón:

Pattern phonePattern = Pattern.compile("(\\d{3})-(\\d{3})-(\\d{4})");
Matcher phoneMatcher = phonePattern.matcher("abcd800-555-1234wxyz");

A continuación, el Matcher debe encontrar la primera subsecuencia que coincida con la expresión regular:

phoneMatcher.find();

Ahora, usando el método de grupo, podemos extraer los datos de la cadena:

String number = phoneMatcher.group(0); //"800-555-1234" (Group 0 is everything the regex matched)
String aCode = phoneMatcher.group(1); //"800"
String threeDigit = phoneMatcher.group(2); //"555"
String fourDigit = phoneMatcher.group(3); //"1234"

Nota: Matcher.group() puede usarse en lugar de Matcher.group(0) .

Java SE 7

Java 7 introdujo los grupos de captura nombrados. Los grupos de captura nombrados funcionan igual que los grupos de captura numerados (pero con un nombre en lugar de un número), aunque hay cambios leves de sintaxis. El uso de grupos de captura con nombre mejora la legibilidad.

Podemos alterar el código anterior para usar grupos nombrados:

(?<AreaCode>\d{3})-(\d{3})-(\d{4})
^----------------^ ^-----^ ^-----^
AreaCode           Group 2 Group 3

Para obtener los contenidos de "AreaCode", podemos usar:

String aCode = phoneMatcher.group("AreaCode"); //"800"