Anker herausstellen

(Auszug aus "Reguläre Ausdrücke" von Jeffrey E. F. Friedl)

Die Optimierungen, die eine Eigenschaft von Ankern (˹^˼, ˹$˼, ˹\G˼ usw.) ausnutzen, gehören zu den effektivsten. Der Treffer wird so an einer bestimmten Position im Suchstring »festgebunden«. Manche Regex-Maschinen finden nicht ohne Weiteres heraus, wann ein solcher »Ankerplatz« vorliegt, aber man kann der Maschine auf die Sprünge helfen.

^oder \G am Anfang eines Ausdrucks ausklammern

Die Ausdrücke ˹^abc|^123˼ und ˹^(?:abc|123)˼ sind logisch gleichwertig, aber viele Regex-Maschinen können bei der ersten Version nicht erkennen, dass hier die Optimierung für Zeilenanker anwendbar ist (siehe Optimierungen mit Zeilen- und String-Ankern). Mit der zweiten Version kann man der Maschine helfen. Die PCRE-Bibliothek (und damit alle Programme, die sie benutzen) erkennt die Optimierung in beiden Fällen, die meisten anderen Werkzeuge mit einem NFA nur im zweiten Fall.

Ein ähnlicher Unterschied ergibt sich bei ˹(^abc)˼ und ˹^(abc)˼. Die erste Version hat eigentlich gar keine Vorteile, sie versteckt den Anker geradezu und bewirkt außerdem, dass von Anfang an der zusätzliche Verwaltungsaufwand für die einfangenden Klammern aufgebracht werden muss. Manche Systeme (PCRE, Perl, die .NET-Sprachen) erkennen die Möglichkeit zur Optimierung in beiden Fällen, andere (Ruby und das Java-Regex-Package von Sun) nur im ausgeklammerten Fall.

Bei Python scheinen überhaupt keine Optimierungen für Anker vorhanden zu sein, daher sind diese Techniken hier nicht anwendbar. Natürlich sind die meisten dieser Optimierungen von Hand für Tcl völlig ohne Belang (mehr dazu im Kasten DFAs, Tcl und das »Tuning« von regulären Ausdrücken).

$ am Ende des Ausdrucks ausklammern

Vom Prinzip her ist das genau das Gleiche wie im vorherigen Abschnitt; auch ˹abc$|123$˼ und ˹(?:abc|123)$˼ sind logisch identisch, werden aber von den verschiedenen Optimierern nicht gleich behandelt. Bei den gegenwärtigen Werkzeugen gibt es nur bei Perl einen Unterschied – nur hier ist die Optimierung mit Ankern für das Zeilenende implementiert (siehe Optimierung mit dem Anker für das String- bzw. Zeilenende). Mit ˹(...|...)$˼ wird die Optimierung angewandt, bei ˹(...$|...$)˼ nicht.

  

<< 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