Capture-Objekte
(Auszug aus "Reguläre Ausdrücke" von Jeffrey E. F. Friedl)
Im Objekt-Modell von .NET gibt es eine Komponente, auf die ich bislang immer nur verwiesen habe: Capture-Objekte. Je nach Standpunkt tut sich damit bei den Match-Resultaten eine neue Dimension auf, oder die Capture-Objekte verwirren nur und blähen das Regex-Paket unnötig auf.
Das Capture-Objekt ähnelt dem Group-Objekt insofern, als es dem Text entspricht, auf den einfangende Klammern (to capture, einfangen) gepasst haben. Wie beim Group-Objekt gibt es hier die Methoden Value (liefert den erkannten Text), Length (liefert die Länge des Textes) und Index (liefert den Abstand des Textes vom Anfang des Suchstrings).
Der entscheidende Unterschied ist: Capture-Objekte sind den Group-Objekten untergeordnet. Jedes Group-Objekt enthält eine Collection von Capture-Objekten, die sich nicht nur auf den endgültigen Treffer beziehen, sondern auch auf alle Textstücke zwischendrin, die auf dem Weg zu diesem Treffer erkannt wurden.
Nehmen wir als Beispiel die Regex ˹^(..)+˼, die auf den String ›abcdefghijk‹ angewandt wird:
Dim M as Match = Regex.Match("abcdefghijk", "^(..)+")
Der Klammerausdruck der Regex passt viermal und erkennt so den größten Teil des Strings: ›abcdefghijk‹. Weil aber der Plus-Quantor außerhalb der Klammern steht, wird der von der Klammer erkannte Text bei jeder Iteration durch die nächsten zwei Zeichen überschrieben; am Ende bleibt für M.Groups(1).Value nur ›ij‹ übrig. Nun enthält aber M.Groups(1) auch eine Reihe von Captures, die den von ˹(..)˼ zwischendrin erkannten Buchstabenpaaren entsprechen, nämlich ›ab‹, ›cd‹, ›ef‹, ›gh‹ und ›ij‹:
M.Groups(1).Captures(0).Value ist ›ab‹
M.Groups(1).Captures(1).Value ist ›cd‹
M.Groups(1).Captures(2).Value ist ›ef‹
M.Groups(1).Captures(3).Value ist ›gh‹
M.Groups(1).Captures(4).Value ist ›ij‹
M.Groups(1).Captures.Count ist 5.
Sie werden bemerken, dass der letzte Captures-Wert dem Wert des ganzen Treffers entspricht, M.Groups(1).Value. In der Tat ist die Value-Eigenschaft eines Group-Objekts nur eine Abkürzung für den letzten Captures-Wert; M.Groups(1).Value ist das Gleiche wie:
M.Groups(1).Captures( M.Groups(1).Captures.Count - 1 ).Value
Ein paar zusätzliche Punkte zu Captures-Objekten:
- M.Groups(1).Captures ist eine CaptureCollection, die wie jede Collection die Eigenschaften Items und Count besitzt. Häufig verzichtet man aber auf die Items-Eigenschaft und indiziert die Captures-Objekte direkt: M.Groups(1).Captures(3) (in C# mit eckigen Klammern: M.Groups[1].Captures[3]).
- Captures-Objekte haben keine Success-Methode. Da Captures-Objekte nur existieren können, wenn die Klammer mindestens einmal gepasst hat, testet man stattdessen die Success-Methode des einschließenden Group-Objekts.
- Bisher wurden nur Captures-Objekte gezeigt, die Teil eines Group-Objekts waren. Sie ist zwar dort nicht besonders wichtig, aber auch Match-Objekte haben eine Captures-Eigenschaft. Mit M.Captures hat man direkten Zugriff auf das Captures-Objekt der nullten Gruppe (anders gesagt, M.Captures ist dasselbe wie M.Groups(0).Captures). Das nullte Klammerobjekt ist aber der gesamte Treffer, und bei diesem kann es keine Treffer »zwischendrin« geben. Daher enthält die nullte CaptureCollection immer nur ein Element. Da dieses Captures-Objekt exakt die gleichen Daten enthält wie das nullte Group-Objekt, sind weder M.Captures noch M.Groups(0).Captures besonders nützlich.
Die Capture-Objekte in .NET sind eine interessante Neuentwicklung, die vor allem deshalb verwirrend ist, weil sie das Objekt-Modell überstrapaziert. Nachdem ich die .NET-Dokumentation bewältigt hatte und endlich verstanden habe, was diese Objekte wirklich leisten, bin ich etwas ratlos. Einerseits ist es eine Neuentwicklung, die ich gerne näher kennenlernen möchte. Mir fallen aber keine Anwendungen ein, für die die Captures-Objekte wie geschaffen wären. Aber das liegt vielleicht vor allem daran, dass ich mit dieser Neuentwicklung noch nicht die jahrelange Erfahrung wie mit anderen Regex-Features habe.
Andererseits bedeuten diese Capture-Gruppen einen zusätzlichen Aufwand während der Mustersuche und nachher bei der Verkapselung in die Resultat-Objekte, und diese zusätzliche Arbeit sollte eigentlich nur dann aufgewendet werden, wenn die entsprechende Information auch wirklich benötigt wird. In den allermeisten Fällen wird wohl keine Capture-Gruppe gebraucht, aber in der aktuellen Implementation werden die Group- und Capture-Objekte (und die dazugehörigen GroupCollection- und CaptureCollection-Objekte) immer miterzeugt, wenn das Match-Objekt erzeugt wird. Die Capture-Objekte sind also auf jeden Fall vorhanden. Verwenden Sie sie, wenn Sie einen guten Verwendungszweck dafür finden.
<< zurück | vor >> |
Tipp der data2type-Redaktion: Zum Thema Reguläre Ausdrücke bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an: |
Copyright der deutschen Ausgabe © 2008 by O’Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "Reguläre Ausdrücke" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.
O’Reilly Verlag GmbH & Co. KG, Balthasarstr. 81, 50670 Köln