Reguläre Ausdrücke als Programmiersprache

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

Wenn Sie noch nie mit regulären Ausdrücken gearbeitet haben, werden Sie den regulären Ausdruck ˹^(From|Subject):˼ aus dem letzten Beispiel nicht verstehen; aber es ist nichts Magisches daran. Zudem: Es ist nichts Magisches hinter der Magie. Ein Magier tut einfach Dinge, die für die Nicht-Eingeweihten im Publikum unmöglich oder widernatürlich aussehen. Wenn Sie gelernt haben, wie man eine Spielkarte in der Hand hält, sodass es aussieht, als ob die Hand leer wäre, haben Sie »magische Fähigkeiten« –- es braucht nur Übung dazu. Es ist wie mit einer Fremdsprache –- wenn man die Grundlagen beherrscht, klingt sie nicht mehr wie völlig unverständliche Lautäußerungen.

Die Analogie zu Dateinamen

Wenn Sie sich für den Kauf dieses Buches entschieden haben, haben Sie wahrscheinlich eine Vorstellung davon, was ein »regulärer Ausdruck« eigentlich ist. Aber auch, wenn Sie keine solche haben, kennen Sie ziemlich sicher das zugrunde liegende Konzept.

Sie wissen, dass report.txt einen Namen für eine ganz bestimmte Datei darstellt. Wenn Sie auch nur ein klein wenig Erfahrung mit Unix oder DOS/Windows haben, wissen Sie, dass das Muster »*.txt« dazu benutzt wird, um mehrere Dateien auszuwählen. Bei solchen Mustern (Dateiglobs oder Wildcards genannt) gibt es einige wenige Zeichen, die eine spezielle Bedeutung haben. Das Sternchen steht für »irgendwelche Zeichen«, und das Fragezeichen steht für »irgendein Zeichen«. Mit dem Dateiglob »*.txt« beginnen wir mit »irgendwas« ˹*˼ und enden mit dem Literal ˹.txt˼, also haben wir ein Muster, das aussagt: »Wähle die Dateien, deren Namen mit irgendwas beginnen und mit .txt aufhören.«

Die meisten Systeme kennen noch zusätzliche Spezialzeichen, aber im Allgemeinen ist die Ausdruckskraft solcher Dateiglobs doch recht begrenzt. Das ist kaum von Nachteil, weil auch der Umfang des Problems (eine bequeme Art, Gruppen von Dateien zu bezeichnen) doch recht limitiert ist, auf ordinäre Dateinamen eben.

Die Behandlung von beliebigen Texten ist dagegen ein ungleich komplexeres Problem. Prosa, Poesie, Programm-Listings, Memos, HTML, Artikel, Tabellen, Buchmanuskripte (wie dieses), Wörterlisten; die Aufzählung ist unvollständig. Für eine bestimmte Untergruppe, wie eben das Auswählen von Dateien, lässt sich ohne Weiteres ein spezialisiertes Werkzeug entwickeln.

Über die Jahre hat sich jedoch eine generalisierte Sprache entwickelt, die genügend mächtig und ausdrucksstark für eine große Variationsbreite von Verwendungszwecken ist. Jedes Programm implementiert und benutzt diese Muster in leicht unterschiedlicher Weise, aber alle fallen unter den Begriff »reguläre Ausdrücke«.

Die Analogie zu natürlichen Sprachen

Reguläre Ausdrücke sind aus zwei Typen von Zeichen aufgebaut. Die Spezialzeichen (wie das * aus der Dateinamen-Analogie) heißen Metazeichen, alle anderen Buchstaben sind Literale. Bei regulären Ausdrücken geht die Verwendung von Metazeichen weit über den Bereich von Dateiglobs hinaus. Muster von Dateinamen können mit wenigen Metazeichen behandelt werden, aber die »Programmiersprache« der regulären Ausdrücke erfordert viele und ausdrucksstarke Metazeichen.

Es kann helfen, reguläre Ausdrücke als eigene Sprache zu betrachten, wobei den Literalen die Rolle der Wörter zukommt und den Metazeichen die Rolle der Grammatik. Wörter werden nach den Regeln der Grammatik so kombiniert, dass der resultierende Satz oder Ausdruck einen Sinn ergibt. Im E-Mail-Beispiel habe ich ˹^(From|Subject) benutzt, um Zeilen zu finden, die mit ›From:‹ oder ›Subject:‹ beginnen. Die Metazeichen sind hier unterstrichen, und wir kommen bald zur Erklärung der Bedeutung dieser Zeichen.

Wie beim Erlernen jeder neuen Sprache fühlt man sich auch bei regulären Ausdrücken zunächst mal etwas ratlos. Darum sehen sie auch wie Magie aus, wenn man nur wenig davon versteht, und wie völliger Buchstabensalat für jemanden, der gar nichts davon versteht. Ganz ähnlich wie 正規表現は簡単にです! (Anmerkung: »Reguläre Ausdrücke sind einfach!« Ein humoristischer Kommentar dazu: Wie unter Features und Dialekte erklärt, kommt der Terminus regulärer Ausdruck ursprünglich aus der formalen Algebra. Wenn mich jemand fragt, wovon denn das Buch handle, dann ergibt die Antwort »reguläre Ausdrücke« meist fragende Gesichter bei Leuten, die nicht häufig mit Computern umgehen. Das japanische Wort für regulären Ausdruck, 正規表現, bedeutet auch für den Durchschnittsjapaner ähnlich wenig wie das deutsche Gegenstück, aber von Japanern ernte ich etwas mehr als nur einen verständnislosen Blick. Im Japanischen wird nämlich »regulär« fast genau gleich ausgesprochen wie ein anderes, wesentlich häufigeres Wort, ein medizinischer Ausdruck für »Fortpflanzungsorgane«. Man kann sich ausmalen, was für Vorstellungen dabei geweckt werden ...) für einen Japanisch-Schüler schnell verständlich ist, wird Ihnen der reguläre Ausdruck

s!<emphasis>([0­9]+(\.[0­9]+){3})</emphasis>!<inet>$1</inet>!

bald kristallklar sein.

Dieses Beispiel kommt aus der Produktion dieses Buches und stammt von meinem Lektor. Ich hatte irrtümlich das Tag <emphasis> benutzt, um Internet-Adressen zu markieren (IP-Adressen bestehen aus Ziffern und Punkten, wie etwa 209.204.146.22). Das Skript benutzt den Substitutionsoperator von Perl mit dem regulären Ausdruck

˹<emphasis>([0­9]+(\.[0­9]+){3})</emphasis>˼

um diese falschen Tags durch das korrekte <inet>-Tag zu ersetzen, und lässt dabei andere <emphasis>-Tags so, wie sie sind. Später werden wir genau diese Anwendung im Detail besprechen, damit Sie die entsprechenden Methoden in Ihrer Programmiersprache anwenden können.

Das Ziel dieses Buches

Die Wahrscheinlichkeit, dass Sie jemals <emphasis> durch <inet> ersetzen müssen, ist gering, aber es ist sehr wahrscheinlich, dass das Problem »Ersetze dies durch das« auch bei Ihnen auftritt. Das Ziel dieses Buches ist es nicht, fertige Lösungen für spezifische Probleme zu geben, sondern vielmehr zu zeigen, wie man in regulären Ausdrücken denkt, sodass Sie sie anwenden können, wann immer ein so geartetes Problem auftaucht.

  

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