No serás el primero que esté confuso al respecto. Esto es lo que el famoso Jeffrey Friedl tiene que decir al respecto (páginas 437+):
Dependiendo de su vista, agrega una nueva dimensión interesante a los resultados del partido, o agrega confusión e hinchazón.
Y más adelante:
La principal diferencia entre un objeto de grupo y un objeto de captura es que cada objeto de grupo contiene una colección de capturas que representan todas las coincidencias intermedias del grupo durante la coincidencia, así como el texto final coincidente por el grupo.
Y unas páginas después, esta es su conclusión:
Después de pasar la documentación de .NET y comprender realmente lo que agregan estos objetos, tengo sentimientos encontrados sobre ellos. Por un lado, es una innovación interesante [..] por otro lado, parece agregar una carga de eficiencia [..] de una funcionalidad que no se utilizará en la mayoría de los casos
En otras palabras: son muy similares, pero ocasionalmente y como sucede, encontrará un uso para ellos. Antes de que te crezca otra barba gris, incluso puedes encariñarte con las Capturas ...
Dado que ni lo anterior ni lo que se dice en la otra publicación realmente parece responder a su pregunta, considere lo siguiente. Piense en Captures como una especie de rastreador de historia. Cuando la expresión regular hace su combinación, pasa a través de la cadena de izquierda a derecha (ignorando el retroceso por un momento) y cuando encuentra un paréntesis de captura coincidente, lo almacenará en $x
(x siendo cualquier dígito), digamos$1
.
Los motores regex normales, cuando se deben repetir los paréntesis de captura, descartarán la corriente $1
y la reemplazarán con el nuevo valor. No .NET, que mantendrá este historial y lo colocará enCaptures[0]
.
Si cambiamos su expresión regular para que tenga el siguiente aspecto:
MatchCollection matches = Regex.Matches("{Q}{R}{S}", @"(\{[A-Z]\})+");
notará que el primero Group
tendrá uno Captures
(el primer grupo siempre será la coincidencia completa, es decir, igual a $0
) y el segundo grupo se mantendrá {S}
, es decir, solo el último grupo coincidente. Sin embargo, y aquí está la captura, si desea encontrar las otras dos capturas, están en Captures
, que contiene todas las capturas intermedias para {Q}
{R}
y {S}
.
Si alguna vez se preguntó cómo podría obtener de la captura múltiple, que solo muestra la última coincidencia con las capturas individuales que están claramente allí en la cadena, debe usar Captures
.
Una última palabra sobre su pregunta final: la coincidencia total siempre tiene una captura total, no mezcle eso con los grupos individuales. Las capturas solo son interesantes dentro de los grupos .
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.(?:..)+
. Empareja perezosamente cualquier cosa.*?
hasta una subexpresión de captura (grupo). Continúa en. Dentro de una sola coincidencia, una colección grupal precipita una serie de lo que se necesita. No hay necesidad de encontrar el siguiente, no hay reentrada, por lo que es de 10 a 20 o más veces más rápido.a functionality that won't be used in the majority of cases
. De hecho, es la funcionalidad más buscada en regex land. ¿Perezoso / codicioso? ¿Qué tiene eso que ver con mis comentarios? Permite tener una cantidad variable de memorias intermedias de captura. Puede barrer toda la cadena en una sola coincidencia. Si.*?(dog)
busca el primerdog
continuación(?:.*?(dog))+
encontrarán todosdog
en la cadena completa en una única partida. El aumento de rendimiento es notable.Un grupo es lo que hemos asociado con grupos en expresiones regulares
excepto que estos son solo grupos 'capturados'. Los grupos que no capturan (usando la sintaxis '(?:') No se representan aquí.
Una captura también es lo que hemos asociado con 'grupos capturados'. Pero cuando el grupo se aplica con un cuantificador varias veces, solo la última coincidencia se mantiene como la coincidencia del grupo. La matriz de capturas almacena todas estas coincidencias.
En cuanto a su última pregunta, habría pensado antes de analizar esto que las Capturas serían una serie de capturas ordenadas por el grupo al que pertenecen. Más bien es solo un alias para los grupos [0] .Capturas. Bastante inútil ..
fuente
Esto se puede explicar con un simple ejemplo (e imágenes).
Coincidencia
3:10pm
con la expresión regular((\d)+):((\d)+)(am|pm)
y uso de Mono interactivocsharp
:Entonces, ¿dónde está el 1?
Dado que hay varios dígitos que coinciden en el cuarto grupo, solo "llegamos" a la última coincidencia si hacemos referencia al grupo (con un implícito
ToString()
, es decir). Para exponer las coincidencias intermedias, debemos profundizar y hacer referencia a laCaptures
propiedad en el grupo en cuestión:Cortesía de este artículo .
fuente
De la documentación de MSDN :
fuente
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.Salida :
Analicemos solo el primer partido (
match0
).Como se puede ver hay tres grupos de menor importancia :
group3
,group4
ygroup5
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 degroup4
ygroup5
). 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:
Nuevamente, analicemos solo el primer partido (
match0
).No hay mas grupos menores
group4
ygroup5
debido a la(...){3}
repetición ( {n} en donde n> = 2 ) se han fusionado en un solo grupogroup3
.En este caso, el
group3
valor corresponde a élcapture2
( 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 deCaptures
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.
fuente