Imagine que tiene la siguiente introducción de texto dogcatcatcat
y un patrón como dog(cat(catcat))
En este caso, usted tiene 3 grupos, el primero (grupo importante) corresponde al partido.
Partido == == dogcatcatcat
y Grupo0 dogcatcatcat
Grupo 1 == catcatcat
Group2 == catcat
Entonces, ¿qué es todo esto?
Consideremos un pequeño ejemplo escrito en C# (.NET) usando la clase Regex
.
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
Vamos a analizar sólo el primer partido (match0
).
Como se puede ver hay tres grupos de menores : group3
, group4
y group5
group3 = kjl
capture0 = kjl
group4 = mno
capture0 = mno
group5 = pqr
capture0 = pqr
Esos grupos (3-5) fueron creados debido a la 'sub-patrón ' (...)(...)(...)
del principal patrón(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 de grupo como (...){3}
.
Ok, vamos a considerar otro ejemplo, donde hay una repetición grupo.
En caso de modificar el patrón de expresión regular para buscar coincidencias (por código de la imagen arriba) (dog(cat(...)(...)(...)))
-(dog(cat(...){3}))
, se dará cuenta de que existe la siguiente repetición grupo: (...){3}
.
Ahora el 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
Una vez más, vamos a analizar sólo el primer partido (match0
).
No hay más grupos menores group4
y group5
debido (...){3}
repetición ({n} en donden> = 2) que han sido fusionados en un solo grupo group3
.
En este caso, el valor corresponde a group3
es capture2
(la última captura, en otras palabras).
Por lo tanto, si necesita todas las 3 capturas interiores (capture0
, capture1
, capture2
) que tendrá que desplazarse a través de la colección del grupo Captures
.
La ubicación es: preste atención a la forma en que diseña los grupos de su patrón. Usted debe pensar por adelantado qué comportamiento hace que la especificación del grupo, como (...)(...)
, (...){2}
o (.{3}){2}
etc.
Es de esperar que ayudará a arrojar algo de luz sobre las diferencias entre Captura, Grupos y Partidos como bien.
¡Gracias, el ejemplo concreto lo aclara! –
'una funcionalidad que no se usará en la mayoría de los casos' Creo que se perdió el barco. En el corto plazo '(?:. *? (Información de la colección)) {4,20}' aumenta la eficiencia en más de un cientos de por ciento. – sln
@sln, no estoy seguro de a qué se refiere y quién es "él" (¿frito?). El ejemplo que das parece no estar relacionado con esta discusión, o con las expresiones usadas. Además, los cuantificadores no codiciosos rara vez son más eficientes que los cuantificadores codiciosos, y requieren el conocimiento del conjunto de entrada y las pruebas de perfusión cuidadosas. – Abel