Imaginez que vous ayez la saisie de texte suivante dogcatcatcat
et un modèle commedog(cat(catcat))
Dans ce cas, vous avez 3 groupes, le premier ( grand groupe ) correspond au match.
Match == dogcatcatcat
et Group0 ==dogcatcatcat
Groupe1 == catcatcat
Groupe2 == catcat
Alors de quoi s'agit-il?
Prenons un petit exemple écrit en C # (.NET) en utilisant la 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();
}
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
, group4
etgroup5
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 group3
correspond à sa capture ( capture0
). (Comme dans le cas de group4
et 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 à group5
cause de la (...){3}
répétition ( {n} où n> = 2 ) ils ont été fusionnés en un seul groupe group3
.
Dans ce cas, la group3
valeur 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 Captures
de 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 cases
Je pense qu'il a raté le bateau. À court terme,(?:.*?(collection info)){4,20}
augmente l'efficacité de plus de quelques centaines de pour cent.