Regel 1: Der am weitesten links beginnende Treffer gewinnt

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

Die Regel besagt, dass ein Treffer, der früher in einem String beginnt, als besser eingeschätzt wird als ein anderer, auch möglicher Treffer, der erst weiter rechts beginnt. Die Regel sagt nichts über die Länge des erkannten Textes aus (dazu kommen wir noch), sondern besagt nur, dass unter allen möglichen Treffern der erkannt wird, der am weitesten links beginnt. Nun kann es ja auch sein, dass mehrere mögliche Treffer am selben Ort beginnen; die Regel sollte daher lauten: »Einer der ... Treffer gewinnt«, aber das klingt merkwürdig.

Und so wird nach der Regel verfahren: Der erste Treffer wird ganz vorn (genau vor dem ersten Zeichen) im Such-String versucht. »Versucht« heißt, dass jede mögliche Kombination des (vielleicht komplizierten) regulären Ausdrucks hier ausprobiert wird. Weht gefunden« wird nur genau dann zurückgeliefert, wenn alle Versuche an allen Positionen (bis hin zur Position genau hinter dem letzten Zeichen) fehlschlagen.

Wenn wir ˹ORA˼ auf ANORAK anwenden, wird der erste Versuch am Anfang des Strings fehlschlagen (weil ˹ORA˼ nicht auf ANO passt). Auch der zweite Versuch schlägt fehl (auch NOR passt nicht). Der dritte Versuch ist dagegen erfolgreich, und die Regex-Maschine liefert das Resultat ANORAK.

Wenn Sie die Regel nicht kennen, können manche Resultate überraschen. Wenn zum Beispiel ˹der˼ im String

Das Federvieh war der Lebenszweck der Witwe Bolte

gesucht werden soll, wird der Treffer bei Federvieh gefunden, nicht erst beim Wort der. Das Wort der könnte ein Treffer sein, aber Federvieh erscheint früher im String, und so wird der Treffer dort gemeldet. Bei einem Programm wie egrep spielt das keine Rolle – egrep kümmert es nur, ob es einen Treffer gibt, und nicht, wo dieser auftritt. Bei anderen Anwendungen, etwa beim Suchen und Ersetzen, spielt das sehr wohl eine Rolle.

Hier ein (ganz einfaches) Problem: Was erkennt der Ausdruck ˹Bolte|Leben|Feder|Witwe˼ im String ›Das Federvieh war der Lebenszweck der Witwe Bolte‹? Die Antwort finden Sie hier:

Auflösung

Beachten Sie, dass die Regex bei jeder Position vollständig ausprobiert wird. Wenn wir etwa nach ˹Bolte|Leben|Feder|Witwe˼ suchen, wird bei Feder ein Treffer gefunden, ›Das Federvieh war der Lebenszweck der Witwe Bolte‹, und nicht bei Bolte, obwohl dieses Wort als erste Alternative auftritt.

Klar, die Regex könnte auch auf Bolte und die anderen Wörter passen, aber weil das nicht die frühesten möglichen Treffer sind, werden sie nicht gefunden. Wie gesagt werden alle Permutationen der ganzen Regex durchgegangen, bevor das Spiel bei der nächsten Position wiederholt wird; in diesem Fall werden alle Alternativen – ˹Bolte˼, ˹Leben˼, ˹Feder˼ und ˹Witwe˼ – getestet, bevor im String fortgefahren wird.

Das »Getriebe« schaltet zum nächsten Zeichen

Diese Regel kann man sich ähnlich vorstellen wie das Getriebe eines Autos, das die Kraft des Motors an die Antriebsräder weitergibt. Die eigentliche Arbeit leistet der Motor, indem er die Kurbelwelle dreht. Dem Getriebe kommt die Aufgabe zu, im jeweiligen Gang die Kraft auf den Antrieb weiterzuleiten.

Die Hauptaufgabe des Getriebes: Weiterschalten

Wenn die Regex-Maschine am Anfang des Strings keinen Treffer findet, schaltet das Getriebe in den nächsten Gang, d.h. zur nächsten Position im String und zur nächsten, zur nächsten usw. – normalerweise. Wenn nun zum Beispiel die Regex mit einem Zeilenanker beginnt, kann das Getriebe feststellen, dass jedes Weiterschalten unnütz ist, weil ein Treffer nur am Anfang des Strings möglich ist. Diese und andere interne Optimierungen werden unter Die Kunst, reguläre Ausdrücke zu schreiben erläutert.

  

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