Gastautor 1. Februar 2007

Was sind reguläre Ausdrücke?

Kein Beitragsbild

von Christian Prior

Wegen ihrer Komplexität oft auch von erfahrenen Programmierern gemieden, sind reguläre Ausdrücke ein mächtiges Instrument für Dateimanipulationen aller Art.

Ob das Apache mod_rewrite Modul oder die Stringumformungen in PHP und Perl – etwas Grundverständnis vorausgesetzt, bieten reguläre Ausdrücke mehr als das Suchen und Ersetzen von Texten.

Ein Artikel über reguläre Ausdrücke kommt jedoch nie um Einschränkungen herum – die Syntax ist je nach verwendeter Programmiersprache leicht unterschiedlich und selten voll dokumentiert. Als Grundlage wurde daher der Texteditor NoteTab Light gewählt, welcher frei verfügbar ist und keinen Script Interpreter erfordert. Außerdem soll entgegen der vielen anderen Tutorials im Netz hier eine Übersicht über verbreitete Syntax-Bestandteile gegeben werden.

Screenshot
lFind and Replace

Damit ist die Auseinandersetzung mit Regulären Ausdrücken innerhalb eines einfachen Textfiles möglich, und man braucht nicht über einen Scriptinterpreter zu testen. So kann man die vielen Beispiel-RegExs aus dem Netz in aller Ruhe auf seine Bedürfnisse hin umbauen. Für Poweranwendungen bietet NoteTab weiterhin eine eigene Scriptsprache, mit der sich dateiweites Suchen und Ersetzen -ganz wie in Dreamweaver – realisieren lässt.

Die Eingabe erfolgt ganz einfach über das normale „Find and Replace“ Fenster mit angehaktem „Regular Exp.“ Die abgebildete RegEx wird in ihrer Funktionsweise am Ende des Artikels erklärt – wer findet es vorher heraus?

Der Punkt <.>
Bezeichnet ein beliebiges Zeichen außer dem Zeilenende
Beispiel: (.)+ Ein oder mehrere beliebige Zeichen ohne Zeilenende.

Alphanumerische Zeichen: <a-z> oder <0-9>
Stehen für ein Zeichen innerhalb der angegeben Reihe und sind letztlich Abkürzungen
Beispiel: (0123456789) Ist gleichbedeutend mit (0-9)
In NoteTab wird Groß- und Kleinschreibung nicht beachtet.

Screenshot
Praktisch: der Online Regex-Tester

Zirkumflex <^>
Hat zwei Bedeutungen: Überall in der RegEx steht dieses Zeichen für „suche Treffer nur vom Zeilenanfang an“
Beispiel: ^(0-9) Zeilenanfang, gefolgt von einem numerischen Zeichen

Anders jedoch innerhalb der später erläuterten Zeichenklasse, dort verneint es folgende Bestandteile.
Beispiel: [^#] Alle Zeichen außer dem #
NoteTab erlaubt hier für den ersten Fall eine sehr freie Platzierung.

Dollar Zeichen <$>
Markiert das Ende einer Zeile in einem regulären Ausdruck
Beispiel: [^0-9]$ Kein numerisches Zeichen am Zeilenende.

Backslash <\>
Maskiert eines der hier aufgeführten Sonderzeichen
Beispiel: index\.php?Cat=(0-9)* Erkennt den Punkt des Dateinamens.

Stern <*>
Bedeutet eine Anzahl Null oder mehr
Beispiel: ab*c Wahr, wenn a und c einmal vorhanden sind und null oder mehrere b.

Fragezeichen <?>
Bedeutet die Anzahl null oder eins
Beispiel: ab?c Ist falsch für abbc.

Pluszeichen <+>
Beudeutet die Anzahl eins oder mehr
Beispiel: ab+c Ist wahr für abbbc und falsch für ac.

Pipe Zeichen <|>
Bedeutet das logische oder. Mehrere Reguläre Ausdrücke können so miteinander verknüpft werden. Wird ein Treffer gefunden, werden die folgenden Ausdrücke nicht mehr beachtet.

Zeichenklassen mit <[> und <]>
Innerhalb dieser Klammern wird nach einem der umschlossenen Zeichen gesucht.
Beispiel: [abc] Liefert einen Treffer für a, b oder c.
Will man nach mehreren Zeichen suchen, kann +, * oder ? verwenden.

Besonders elegant sind oft die Verneinungen mit ^.
In NoteTab sind nur ] und – innerhalb von Zeichenklassen zu maskieren.

Geschweifte Klammern <{> und <}>
Wird ein Treffer für den regulären Ausdruck innerhalb der Klammern gefunden, so steht er in der replace-Funktion zur Verfügung. Die Syntax lautet lautet <backslash1-9>, \1 liefert also den Inhalt des ersten von links auftretenden geschweiften Klammerpaares.
Diese Syntax variert besonders stark bei den unterschiedlichen RegEx-Maschinen. PERL beispielsweise liefert alles in einfachen Klammern mittels $1 etc.

Einfache Klammern <(> <)>
Dienen der Gruppierung von Suchbegriffen und werden besonders bei der Suche nach Strings benötigt:
Falsches Beispiel: DrWeb|Ideenreich Sucht in Wirklichkeit nach DrWe(b|I)deenreich.

Richtig für eine Suche nach entweder DrWeb oder Ideenreich:
(DrWeb)|(Ideenreich)

Wird ‚DrWeb‘ gefunden, wird die Suche nach ‚Ideenreich‘ nicht mehr fortgesetzt.

Sonderzeichen
Es gibt einige spezielle Kombinationen, deren Bedeutung ebenfalls über NoteTab hinaus gleich bleibt.

\s Steht für ein Leerzeichen.
\a Ist jedes Zeichen inklusive Zeilenumbrüche.
\b Meint jede Art von Leerzeichen, inklusive Tab und Zeilenumbruch und
\d alle numerischen Zeichen, also gleichbedeutend mit [0-9] oder[0123456789].

Damit haben wir schon die grundsätzlichen Zeichen kennen gelernt. Für eine weitergehende Beschäftigung sei zum einen auf die Dokumentation des Programms verwiesen, welches weitere Sonderzeichen auflistet. Außerdem ist das Buch „Reguläre Ausdrücke“ von Jeffrey E. F. Friedl aus dem O’Reilly Verlag Standardwerk – exzellent übersetzt von Andreas Karrer. Insbesondere für die Funktionsweise des Treffer-Findens und die Gefahren mit dem * soll auf diese Quelle verwiesen werden.

Doch zurück zum oben gezeigten Ausdruck:
Was bedeutet Suche ^{.+[^\s]}\s* und ersetze dies mit \1 ?

Um gleich von Beginn jede Oberflächlichkeit zu vermeiden, hier eine Übersetzung in beschreibende Worte: Suche vom Zeilenanfang an ein beliebiges Zeichen ohne Zeilenumbruch, welches einmal der mehrmals vorkommt sowie nicht von einem Leerzeichen gefolgt sind. Dieses Teilergebnis wird intern gespeichert. Suche nach folgenden Leerzeichen und beachte diese nicht beim Ersetzen. Die Lösung: Damit entfernt man alle unbeabsichtigt angehängten Leerzeichen in seinem Programmcode.

Für Fortgeschrittene sei der Zusatz gebracht, dass NoteTab – beginnend von der linken Seite – den längsten passenden Ausdruck liefert, also POSIX konform ist. Vom Umfang her soll die RegEx Implementierung von NoteTab laut dem Willen des Autors Erik Fookes zwischen EGREP und AWK liegen.

NoteTabLight ist hier erhältlich

Dr. Webs exklusiver Newsletter
Hinweise zum Datenschutz, also dem Einsatz von Double-Opt-In, der Protokollierung der Anmeldung, der Erfolgsmessung, dem Einsatz von MailChimp als Versanddienstleister und deinen Widerrufsrechten findest du in unseren Datenschutzhinweisen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Kennst du schon unseren Newsletter?

Hinweise zum Datenschutz, also dem Einsatz von Double-Opt-In, der Protokollierung der Anmeldung, der Erfolgsmessung, dem Einsatz von MailChimp als Versanddienstleister und deinen Widerrufsrechten findest du in unseren Datenschutzhinweisen.