Imagine que tiene la siguiente entrada de texto dogcatcatcat
y un patrón comodog(cat(catcat))
En este caso, tiene 3 grupos, el primero ( grupo principal ) corresponde a la coincidencia.
Match == dogcatcatcat
y Group0 ==dogcatcatcat
Grupo1 == catcatcat
Grupo2 == catcat
Entonces, ¿de qué se trata?
Consideremos un pequeño ejemplo escrito en C # (.NET) usando la Regex
clase.
int matchIndex = 0;
int groupIndex = 0;
int captureIndex = 0;
foreach (Match match in Regex.Matches(
"dogcatabcdefghidogcatkjlmnopqr", // input
@"(dog(cat(...)(...)(...)))") // pattern
)
{
Console.Out.WriteLine($"match{matchIndex++} = {match}");
foreach (Group @group in match.Groups)
{
Console.Out.WriteLine($"\tgroup{groupIndex++} = {@group}");
foreach (Capture capture in @group.Captures)
{
Console.Out.WriteLine($"\t\tcapture{captureIndex++} = {capture}");
}
captureIndex = 0;
}
groupIndex = 0;
Console.Out.WriteLine();
}
Salida :
match0 = dogcatabcdefghi
group0 = dogcatabcdefghi
capture0 = dogcatabcdefghi
group1 = dogcatabcdefghi
capture0 = dogcatabcdefghi
group2 = catabcdefghi
capture0 = catabcdefghi
group3 = abc
capture0 = abc
group4 = def
capture0 = def
group5 = ghi
capture0 = ghi
match1 = dogcatkjlmnopqr
group0 = dogcatkjlmnopqr
capture0 = dogcatkjlmnopqr
group1 = dogcatkjlmnopqr
capture0 = dogcatkjlmnopqr
group2 = catkjlmnopqr
capture0 = catkjlmnopqr
group3 = kjl
capture0 = kjl
group4 = mno
capture0 = mno
group5 = pqr
capture0 = pqr
Analicemos solo el primer partido ( match0
).
Como se puede ver hay tres grupos de menor importancia : group3
, group4
ygroup5
group3 = kjl
capture0 = kjl
group4 = mno
capture0 = mno
group5 = pqr
capture0 = pqr
Esos grupos (3-5) se crearon debido al ' subpatrón ' (...)(...)(...)
del patrón principal (dog(cat(...)(...)(...)))
El valor de group3
corresponde a su captura ( capture0
). (Como en el caso de group4
y group5
). Eso es porque no hay repetición grupal como (...){3}
.
Ok, consideremos otro ejemplo donde hay una repetición grupal .
En caso de modificar el patrón de expresión regular para buscar coincidencias (por código que se muestra más arriba) a partir (dog(cat(...)(...)(...)))
de (dog(cat(...){3}))
, usted notará que existe la siguiente repetición del grupo : (...){3}
.
Ahora la salida ha cambiado:
match0 = dogcatabcdefghi
group0 = dogcatabcdefghi
capture0 = dogcatabcdefghi
group1 = dogcatabcdefghi
capture0 = dogcatabcdefghi
group2 = catabcdefghi
capture0 = catabcdefghi
group3 = ghi
capture0 = abc
capture1 = def
capture2 = ghi
match1 = dogcatkjlmnopqr
group0 = dogcatkjlmnopqr
capture0 = dogcatkjlmnopqr
group1 = dogcatkjlmnopqr
capture0 = dogcatkjlmnopqr
group2 = catkjlmnopqr
capture0 = catkjlmnopqr
group3 = pqr
capture0 = kjl
capture1 = mno
capture2 = pqr
Nuevamente, analicemos solo el primer partido ( match0
).
No hay mas grupos menores group4
y group5
debido a la (...){3}
repetición ( {n} en donde n> = 2 ) se han fusionado en un solo grupo group3
.
En este caso, el group3
valor corresponde a él capture2
( la última captura , en otras palabras).
Así, si usted necesita todas las 3 capturas interiores ( capture0
, capture1
, capture2
) que tendrá que pasar por el grupo de Captures
colección.
La conclusión es: preste atención a la forma en que diseña los grupos de sus patrones. Usted debe pensar por adelantado qué comportamiento hace que la especificación del grupo, al igual que (...)(...)
, (...){2}
o (.{3}){2}
etc.
Con suerte, ayudará a arrojar algo de luz sobre las diferencias entre las Capturas , Grupos y Partidos también.
a functionality that won't be used in the majority of cases
Creo que perdió el bote. A corto plazo(?:.*?(collection info)){4,20}
aumenta la eficiencia en más de unos pocos cientos por ciento.