Immaginate di avere la seguente immissione del testo dogcatcatcat
e un modello come dog(cat(catcat))
In questo caso, si dispone di 3 gruppi, il primo (grande gruppo) corrisponde alla partita.
Partita == dogcatcatcat
e gruppo0 == dogcatcatcat
Gruppo1 == catcatcat
Group2 == catcat
Quindi di cosa si tratta?
Consideriamo un piccolo esempio scritto in C# (.NET) usando la classe Regex
.
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 partita (match0
).
Come potete vedere ci sono tre gruppi minori : group3
, group4
e group5
group3 = kjl
capture0 = kjl
group4 = mno
capture0 = mno
group5 = pqr
capture0 = pqr
Quei gruppi (3-5) sono stati creati a causa del 'subpattern' (...)(...)(...)
del principale modello(dog(cat(...)(...)(...)))
Valore di group3
corrisponde alla sua cattura (capture0
). (Come nel caso di group4
e group5
). Questo perché non ci sono ripetizioni di gruppo come (...){3}
.
Ok, prendiamo in considerazione un altro esempio in cui v'è una ripetizione gruppo.
Se modifichiamo il modello di espressione regolare da abbinare (per il codice mostrato sopra) (dog(cat(...)(...)(...)))
-(dog(cat(...){3}))
, si noterà che non v'è la seguente ripetizione gruppo: (...){3}
.
Ora il uscita è 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
Anche in questo caso, analizziamo solo la prima partita (match0
).
Non ci sono altri gruppi minori group4
e group5
causa di (...){3}
ripetizione ({n} cui n> = 2) che sono stati fusi in un unico gruppo group3
.
In questo caso, il valore group3
corrisponde alla sua capture2
(dell'ultima cattura, in altre parole).
Quindi se avete bisogno di tutte le 3 catture interne (capture0
, capture1
, capture2
) si dovrà passare da collezione del gruppo Captures
.
ónonclusione: prestare attenzione al modo in cui si progettano i gruppi del modello. Si dovrebbe pensare in anticipo che cosa comportamento causa specifica del gruppo, come (...)(...)
, (...){2}
o (.{3}){2}
ecc
Speriamo che vi aiuterà a far luce sulle differenze tra Cattura, Gruppi e Partite come bene.
Grazie, l'esempio concreto chiarisce! –
'una funzionalità che non verrà utilizzata nella maggior parte dei casi' Penso che abbia perso la barca. A breve termine '(?:. *? (Informazioni sulla raccolta)) {4,20}' aumenta l'efficienza di più del poche centinaia di percento. – sln
@sln, non so a cosa ti riferisci e chi è "lui" (fritto?). L'esempio che date sembra non correlato a questa discussione o alle espressioni usate. Inoltre, i quantificatori non avidi sono solo molto raramente più efficienti dei quantificatori grezzi e richiedono conoscenza del set di input e attenti test di perf. – Abel