Fortsetzungszeilen

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

In Wie Regex-Maschinen arbeiten hatten Sie beim Fortsetzungszeilen-Beispiel unter Wirklich der längste Treffer gesehen, dass ein traditioneller NFA mit ˹^\w+=.*(\\\n.*)*˼ und dem Text

SRC=array.c builtin.c eval.c field.c gawkmisc.c io.c main.c \
        missing.c msg.c node.c re.c version.c

nicht beide Zeilen findet. Das liegt daran, dass das erste ˹.*˼ alles bis hinter den ersten Backslash erkennt und diesen vom eigentlich dafür vorgesehenen ˹(\\\n.*)*˼ verbirgt. Wenn wir nur bis zum Backslash vorgehen wollen, müssen wir das in der Regex auch sagen: Wir können dazu den Punkt durch ˹[^\n\\]˼ ersetzen. (Sie bemerken, dass in der negierten Zeichenklasse auch \n auftritt. Wir hatten angenommen, dass beim verwendeten Dialekt der Punkt nicht auf das Newline passt, das verlangen wir auch von dem Unterausdruck, der den Punkt ersetzt; siehe unter Fast jedes Zeichen: Punkt.)

Wir erhalten so:

˹^\w+=[^\n\\]*(\\\n[^\n\\]*)*˼

Das funktioniert mit den Beispielzeilen aus dem Makefile, aber mit dieser Änderung haben wir uns unter Umständen ein neues Problem eingehandelt: Backslashes sind nun nur am Ende einer Zeile erlaubt. Wenn in den Daten mitten in einer Zeile ein Backslash vorkommt, funktioniert unsere Regex nicht mehr richtig; wir fordern aber, dass auch dieser Fall richtig behandelt wird.

Bis jetzt sind wir immer nach dem Rezept vorgegangen: »Finde eine Zeile, und wenn eine Fortsetzungszeile folgt, auch diese.« Probieren wir jetzt einen ganz anderen Ansatz aus, den ich oft schon mit Erfolg verwendet habe. Wir konzentrieren uns an jedem Punkt auf die Zeichen, die erlaubt sein sollen. Auf der Zeile selbst sollen ›normale‹ Zeichen erlaubt sein (weder Newline noch Backslash) oder aber eine Kombination von Backslash und irgendetwas. Wenn wir dafür ˹\\.˼ nehmen und der »Punkt passt auf alles«-Modus eingeschaltet ist, dann passt das auch auf die Kombination von Backslash und Newline.

Der Ausdruck wird so zu ˹^\w+=([^\n\\]|\\.)*˼ – unter der Voraussetzung, dass der Punkt wirklich alle Zeichen erkennt. Je nach dem Verwendungszweck muss wegen des ˹^˼ am Anfang der Regex auch der Mehrzeilenmodus aktiviert sein (siehe Der Modus »Verbesserte Zeilenanker« oder Mehrzeilenmodus).

Wir sind dennoch noch nicht ganz fertig mit diesem Beispiel – unter Die Kunst, reguläre Ausdrücke zu schreiben werden wir dazu Überlegungen zur Effizienz anstellen (siehe unter Beispiele zum Aufbrechen von Schleifen).

  

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