Immagina di avere il seguente input di testo dogcatcatcate un modello similedog(cat(catcat))
In questo caso, hai 3 gruppi, il primo ( gruppo principale ) corrisponde alla partita.
Match == dogcatcatcate Group0 ==dogcatcatcat
Gruppo1 == catcatcat
Gruppo2 == catcat
Quindi di cosa si tratta?
Consideriamo un piccolo esempio scritto in C # (.NET) usando 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();
}
Uscita :
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
Analizziamo solo la prima corrispondenza ( match0).
Come si può vedere ci sono tre gruppi minori : group3, group4egroup5
group3 = kjl
capture0 = kjl
group4 = mno
capture0 = mno
group5 = pqr
capture0 = pqr
Quei gruppi (3-5) sono stati creati a causa del ' sottostruttura ' (...)(...)(...)del modello principale (dog(cat(...)(...)(...)))
Il valore di group3corrisponde a è capture ( capture0). (Come nel caso di group4e group5). Questo perché non ci sono ripetizioni di gruppo come (...){3}.
Ok, consideriamo un altro esempio in cui c'è una ripetizione di gruppo .
Se modifichiamo il modello di espressione regolare da abbinare (per il codice mostrato sopra) da (dog(cat(...)(...)(...)))a (dog(cat(...){3})), si noterà che non v'è la seguente ripetizione gruppo : (...){3}.
Ora l' output è cambiato:
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
Ancora una volta, analizziamo solo la prima corrispondenza ( match0).
Non ci sono più gruppi minori group4 e a group5causa della (...){3} ripetizione ( {n} in cui n> = 2 ) sono stati uniti in un singolo gruppo group3.
In questo caso, il group3valore corrisponde a esso capture2( l'ultima acquisizione , in altre parole).
Quindi se avete bisogno di tutte le 3 catture interne ( capture0, capture1, capture2) si dovrà scorrere del gruppo Capturesdi raccolta.
La conclusione è: presta attenzione al modo in cui progetti i gruppi del tuo modello. Dovresti pensare in anticipo quale comportamento causa le specifiche del gruppo, come (...)(...), (...){2}o (.{3}){2}ecc.
Speriamo che aiuti a far luce sulle differenze tra Catture , Gruppi e Partite .
a functionality that won't be used in the majority of casesPenso che gli sia sfuggita la barca. A breve termine(?:.*?(collection info)){4,20}aumenta l'efficienza di qualche centinaio.