Imaginez que vous ayez la saisie de texte suivante dogcatcatcatet un modèle commedog(cat(catcat))
Dans ce cas, vous avez 3 groupes, le premier ( grand groupe ) correspond au match.
Match == dogcatcatcatet Group0 ==dogcatcatcat
Groupe1 == catcatcat
Groupe2 == catcat
Alors de quoi s'agit-il?
Prenons un petit exemple écrit en C # (.NET) en utilisant la Regexclasse.
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();
}
Sortie :
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
Analysons juste la première correspondance ( match0).
Comme vous pouvez le voir , il y a trois groupes mineurs : group3, group4etgroup5
group3 = kjl
capture0 = kjl
group4 = mno
capture0 = mno
group5 = pqr
capture0 = pqr
Ces groupes (3-5) ont été créés en raison du `` sous- modèle '' (...)(...)(...)du modèle principal (dog(cat(...)(...)(...)))
La valeur de group3correspond à sa capture ( capture0). (Comme dans le cas de group4et group5). C'est parce qu'il n'y a pas de répétition de groupe comme (...){3}.
Ok, considérons un autre exemple où il y a une répétition de groupe .
Si nous modifions le modèle d'expression régulière pour être adapté (pour le code ci - dessus) de (dog(cat(...)(...)(...)))à (dog(cat(...){3})), vous remarquerez qu'il ya les éléments suivants répétition du groupe : (...){3}.
Maintenant, la sortie a changé:
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
Encore une fois, analysons uniquement la première correspondance ( match0).
Il n'y a plus de groupes mineurs group4 et à group5cause de la (...){3} répétition ( {n} où n> = 2 ) ils ont été fusionnés en un seul groupe group3.
Dans ce cas, la group3valeur correspond à elle capture2( la dernière capture , en d'autres termes).
Ainsi , si vous avez besoin tous les 3 captures intérieures ( capture0, capture1, capture2) vous devrez faire défiler du groupe Capturesde la collection.
La conclusion est la suivante: faites attention à la façon dont vous concevez les groupes de votre modèle. Vous devriez penser dès le départ ce qui cause le comportement des spécifications du groupe, comme (...)(...), (...){2}ou (.{3}){2}etc.
Espérons que cela aidera également à faire la lumière sur les différences entre les captures , les groupes et les matchs .
a functionality that won't be used in the majority of casesJe pense qu'il a raté le bateau. À court terme,(?:.*?(collection info)){4,20}augmente l'efficacité de plus de quelques centaines de pour cent.