Capturar y agrupar
El grupo de captura (pattern)
crea un grupo que tiene propiedad de captura .
Uno relacionado que a menudo puede ver (y usar) es (?:pattern)
, que crea un grupo sin capturar la propiedad, de ahí el nombre de grupo no capturador .
Por lo general, se utiliza un grupo cuando se necesita repetir una secuencia de patrones, por ejemplo (\.\w+)+
, o para especificar dónde debe tener efecto la alternancia, por ejemplo ^(0*1|1*0)$
( ^
, entonces 0*1
o 1*0
, luego $
) versus ^0*1|1*0$
( ^0*1
o 1*0$
).
Un grupo de captura, además de agrupar, también registrará el texto que coincide con el patrón dentro del grupo de captura (pattern)
. Usando su ejemplo (.*):
, .*
partidos ABC
y :
partidos :
, y dado que .*
está dentro de captura de grupo (.*)
, el texto ABC
se registra para el grupo de captura 1.
Número de grupo
El patrón completo se define como el grupo número 0.
Cualquier grupo de captura en el patrón comienza a indexar desde 1. Los índices se definen por el orden de los paréntesis de apertura de los grupos de captura . Como ejemplo, aquí están los 5 grupos de captura en el siguiente patrón:
(group)(?:non-capturing-group)(g(?:ro|u)p( (nested)inside)(another)group)(?=assertion)
| | | | | | || | |
1-----1 | | 4------4 |5-------5 |
| 3---------------3 |
2-----------------------------------------2
Los números de grupo se utilizan en referencia \n
inversa en patrón y $n
en cadena de reemplazo.
En otros sabores de expresiones regulares (PCRE, Perl), también se pueden usar en llamadas a subrutinas .
Puede acceder al texto que coincide con cierto grupo con Matcher.group(int group)
. Los números de grupo se pueden identificar con la regla indicada anteriormente.
En algunos tipos de expresiones regulares (PCRE, Perl), hay una función de reinicio de rama que le permite usar el mismo número para capturar grupos en diferentes ramas de alternancia .
Nombre del grupo
Desde Java 7, puede definir un grupo de captura con nombre (?<name>pattern)
y puede acceder al contenido que coincide con Matcher.group(String name)
. La expresión regular es más larga, pero el código es más significativo, ya que indica lo que está intentando hacer coincidir o extraer con la expresión regular.
Los nombres de los grupos se utilizan como referencia \k<name>
inversa en el patrón y ${name}
en la cadena de reemplazo.
Los grupos de captura con nombre todavía están numerados con el mismo esquema de numeración, por lo que también se puede acceder a ellos a través de Matcher.group(int group)
.
Internamente, la implementación de Java simplemente se asigna desde el nombre al número de grupo. Por lo tanto, no puede utilizar el mismo nombre para 2 grupos de captura diferentes.