Stellen Sie sich vor, Sie haben die folgende Texteingabe dogcatcatcat
und ein Muster wiedog(cat(catcat))
In diesem Fall haben Sie 3 Gruppen, die erste ( Hauptgruppe ) entspricht der Übereinstimmung.
Match == dogcatcatcat
und Group0 ==dogcatcatcat
Gruppe1 == catcatcat
Gruppe2 == catcat
Worum geht es also?
Betrachten wir ein kleines Beispiel, das in C # (.NET) mit Regex
class geschrieben wurde.
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();
}
Ausgabe :
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
Lassen Sie uns nur das erste Match analysieren ( match0
).
Wie Sie sehen können , gibt es drei kleinere Gruppen : group3
, group4
undgroup5
group3 = kjl
capture0 = kjl
group4 = mno
capture0 = mno
group5 = pqr
capture0 = pqr
Diese Gruppen (3-5) wurden aufgrund des " Untermusters " (...)(...)(...)
des Hauptmusters erstellt (dog(cat(...)(...)(...)))
Der Wert von group3
entspricht der Erfassung ( capture0
). (Wie im Fall von group4
und group5
). Das liegt daran, dass es keine Gruppenwiederholungen wie gibt (...){3}
.
Ok, betrachten wir ein anderes Beispiel, in dem es eine Gruppenwiederholung gibt .
Wenn wir das Muster für reguläre Ausdrücke (für den oben gezeigten Code) von (dog(cat(...)(...)(...)))
bis ändern (dog(cat(...){3}))
, werden Sie feststellen, dass es die folgende Gruppenwiederholung gibt : (...){3}
.
Jetzt hat sich die Ausgabe geändert:
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
Lassen Sie uns noch einmal nur das erste Match analysieren ( match0
).
Es gibt keine kleineren Gruppen mehr group4
und group5
aufgrund von (...){3}
Wiederholungen ( {n} wobei n> = 2 ) wurden sie zu einer einzigen Gruppe zusammengeführt group3
.
In diesem Fall group3
entspricht der Wert dem Wert capture2
(mit anderen Worten der letzten Erfassung ).
Wenn Sie also alle 3 inneren Captures (,, ) benötigen capture0
, capture1
müssen capture2
Sie die Captures
Sammlung der Gruppe durchlaufen .
Fazit: Achten Sie darauf, wie Sie die Gruppen Ihres Musters entwerfen. Sie sollten denken , im Voraus , was Verhalten Gruppe Spezifikation verursacht, wie (...)(...)
, (...){2}
oder (.{3}){2}
usw.
Hoffentlich hilft es dabei, die Unterschiede zwischen Captures , Gruppen und Matches zu beleuchten .
a functionality that won't be used in the majority of cases
Ich glaube, er hat das Boot verpasst. Kurzfristig(?:.*?(collection info)){4,20}
erhöht sich die Effizienz um mehr als einige hundert Prozent.