Sie werden nicht der erste sein, der sich darüber im Klaren ist. Hier ist, was der berühmte Jeffrey Friedl dazu zu sagen hat (Seiten 437+):
Abhängig von Ihrer Ansicht fügt es den Spielergebnissen entweder eine interessante neue Dimension hinzu oder sorgt für Verwirrung und Aufblähung.
Und weiter:
Der Hauptunterschied zwischen einem Gruppenobjekt und einem Erfassungsobjekt besteht darin, dass jedes Gruppenobjekt eine Sammlung von Erfassungen enthält, die alle Zwischenübereinstimmungen der Gruppe während der Übereinstimmung sowie den endgültigen Text der Gruppe darstellen.
Und ein paar Seiten später ist dies seine Schlussfolgerung:
Nachdem ich die .NET-Dokumentation hinter mich gebracht und verstanden habe, was diese Objekte hinzufügen, habe ich gemischte Gefühle in Bezug auf sie. Einerseits ist es eine interessante Innovation [..], andererseits scheint es eine Effizienzbelastung [..] einer Funktionalität hinzuzufügen, die in den meisten Fällen nicht verwendet wird
Mit anderen Worten: Sie sind sich sehr ähnlich, aber gelegentlich und wenn es passiert, werden Sie eine Verwendung für sie finden. Bevor Sie sich einen weiteren grauen Bart wachsen lassen, werden Sie vielleicht sogar die Captures lieben ...
Da weder das oben Gesagte noch das, was in dem anderen Beitrag gesagt wird, Ihre Frage wirklich zu beantworten scheint, sollten Sie Folgendes berücksichtigen. Stellen Sie sich Captures als eine Art Verlaufs-Tracker vor. Wenn der reguläre Ausdruck übereinstimmt, durchläuft er die Zeichenfolge von links nach rechts (wobei das Zurückverfolgen für einen Moment ignoriert wird). Wenn er auf übereinstimmende Erfassungsklammern stößt, wird dieser in $x
(x ist eine beliebige Ziffer) gespeichert $1
.
Normale Regex-Engines werfen den Strom weg $1
und ersetzen ihn durch den neuen Wert , wenn die Erfassungsklammern wiederholt werden sollen . Nicht .NET, das diesen Verlauf beibehält und platziert Captures[0]
.
Wenn wir Ihre Regex wie folgt ändern:
MatchCollection matches = Regex.Matches("{Q}{R}{S}", @"(\{[A-Z]\})+");
Sie werden feststellen, dass die erste Group
eine hat Captures
(die erste Gruppe ist immer die gesamte Übereinstimmung, dh gleich $0
), und die zweite Gruppe hält {S}
, dh nur die letzte übereinstimmende Gruppe. Und hier ist der Haken: Wenn Sie die beiden anderen Fänge finden möchten, befinden sie sich in Captures
, die alle Zwischenerfassungen für {Q}
{R}
und enthalten {S}
.
Wenn Sie sich jemals gefragt haben, wie Sie von der Mehrfachaufnahme profitieren können, bei der nur die letzte Übereinstimmung mit den einzelnen Aufnahmen angezeigt wird, die eindeutig in der Zeichenfolge enthalten sind, müssen Sie diese verwenden Captures
.
Ein letztes Wort zu Ihrer letzten Frage: Die Gesamtübereinstimmung hat immer eine Gesamtaufnahme. Mischen Sie diese nicht mit den einzelnen Gruppen. Aufnahmen sind nur innerhalb von Gruppen interessant .
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.(?:..)+
. Ordnen Sie alles faul.*?
einem Capture-Unterausdruck (Gruppe) zu. Weitermachen mit. Innerhalb eines einzelnen Spiels führt eine Gruppensammlung eine Reihe von Informationen aus. Es besteht keine Notwendigkeit, als nächstes zu finden, es gibt keinen Wiedereintritt, wodurch es 10 bis 20 Mal oder öfter schneller wird.a functionality that won't be used in the majority of cases
. Tatsächlich ist es die am meisten nachgefragte Funktionalität im Regex-Land. Faul / gierig? Was hat das mit meinen Kommentaren zu tun? Es ermöglicht eine variable Anzahl von Erfassungspuffern. Es kann die gesamte Zeichenfolge in einem einzigen Match fegen. Wenn.*?(dog)
Funde des erstendog
dann(?:.*?(dog))+
finden alledog
in der gesamten Zeichenfolge in einem Einzelspiel. Die Leistungssteigerung macht sich bemerkbar.Eine Gruppe ist das, was wir Gruppen in regulären Ausdrücken zugeordnet haben
außer dass dies nur "erfasste" Gruppen sind. Nicht erfassende Gruppen (mit der Syntax '(?:') Werden hier nicht dargestellt.
Eine Erfassung ist auch das, was wir mit "erfassten Gruppen" verknüpft haben. Wenn die Gruppe jedoch mehrmals mit einem Quantifizierer angewendet wird, wird nur die letzte Übereinstimmung als Übereinstimmung der Gruppe beibehalten. Das Captures-Array speichert alle diese Übereinstimmungen.
Was Ihre letzte Frage betrifft - ich hätte gedacht, bevor ich mich damit befasste, dass Captures eine Reihe von Captures sind, die nach der Gruppe geordnet sind, zu der sie gehören. Es ist vielmehr nur ein Alias für die Gruppen [0] .Captures. Ziemlich nutzlos ..
quelle
Dies kann anhand eines einfachen Beispiels (und von Bildern) erklärt werden.
Übereinstimmung
3:10pm
mit dem regulären Ausdruck((\d)+):((\d)+)(am|pm)
und Verwendung von Mono Interactivecsharp
:Wo ist die 1?
Da es mehrere Ziffern gibt, die mit der vierten Gruppe übereinstimmen, "erreichen" wir die letzte Übereinstimmung nur, wenn wir auf die Gruppe verweisen (dh implizit
ToString()
). Um die Zwischenübereinstimmungen aufzudecken, müssen wir tiefer gehen und auf dieCaptures
Eigenschaft der betreffenden Gruppe verweisen :Mit freundlicher Genehmigung dieses Artikels .
quelle
Aus der MSDN- Dokumentation :
quelle
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.Ausgabe :
Lassen Sie uns nur das erste Match analysieren (
match0
).Wie Sie sehen können , gibt es drei kleinere Gruppen :
group3
,group4
undgroup5
Diese Gruppen (3-5) wurden aufgrund des " Untermusters "
(...)(...)(...)
des Hauptmusters erstellt(dog(cat(...)(...)(...)))
Der Wert von
group3
entspricht der Erfassung (capture0
). (Wie im Fall vongroup4
undgroup5
). 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:
Lassen Sie uns noch einmal nur das erste Match analysieren (
match0
).Es gibt keine kleineren Gruppen mehr
group4
undgroup5
aufgrund von(...){3}
Wiederholungen ( {n} wobei n> = 2 ) wurden sie zu einer einzigen Gruppe zusammengeführtgroup3
.In diesem Fall
group3
entspricht der Wert dem Wertcapture2
(mit anderen Worten der letzten Erfassung ).Wenn Sie also alle 3 inneren Captures (,, ) benötigen
capture0
,capture1
müssencapture2
Sie dieCaptures
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 .
quelle