Imagine que você tenha a seguinte entrada de texto dogcatcatcat
e um padrão comodog(cat(catcat))
Nesse caso, você tem 3 grupos, o primeiro ( grupo principal ) corresponde à partida.
Corresponder == dogcatcatcat
e Grupo0 ==dogcatcatcat
Grupo1 == catcatcat
Grupo2 == catcat
Então, o que é isso tudo?
Vamos considerar um pequeno exemplo escrito em C # (.NET) usando a Regex
classe
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();
}
Saída :
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 analisar apenas a primeira correspondência ( match0
).
Como você pode ver, existem três grupos menores : group3
, group4
egroup5
group3 = kjl
capture0 = kjl
group4 = mno
capture0 = mno
group5 = pqr
capture0 = pqr
Esses grupos (3-5) foram criados devido ao ' sub-padrão ' (...)(...)(...)
do padrão principal (dog(cat(...)(...)(...)))
O valor de group3
corresponde à sua captura ( capture0
). (Como no caso de group4
e group5
). Isso ocorre porque não há repetição de grupo como (...){3}
.
Ok, vamos considerar outro exemplo em que há uma repetição em grupo .
Se modificar o padrão de expressão regular a ser correspondido (para código mostrado acima) de (dog(cat(...)(...)(...)))
que (dog(cat(...){3}))
, você notará que há a seguinte repetição grupo : (...){3}
.
Agora a saída mudou:
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
Novamente, vamos analisar apenas a primeira correspondência ( match0
).
Não há mais grupos menores group4
e, group5
devido à (...){3}
repetição ( {n} em que n> = 2 ), eles foram mesclados em um único grupo group3
.
Nesse caso, o group3
valor corresponde a ele capture2
( a última captura , em outras palavras).
Assim, se você precisa de todos os 3 captações internas ( capture0
, capture1
, capture2
) você terá que percorrer do grupo Captures
coleção.
A conclusão é: preste atenção na maneira como você cria os grupos de seus padrões. Você deve pensar antecipadamente o comportamento faz com que a especificação do grupo, como (...)(...)
, (...){2}
ou (.{3}){2}
etc.
Espero que ajude a esclarecer as diferenças entre Capturas , Grupos e Jogos também.
a functionality that won't be used in the majority of cases
Eu acho que ele perdeu o barco. No curto prazo,(?:.*?(collection info)){4,20}
aumenta a eficiência em mais do que algumas centenas por cento.