Upline: Infos & Dokus Administration Linux Linux manpages

Reguläre Ausdrücke


Die regulären Ausdrücke finden an verschiedenenen Stellen Verwendung. So kennt sie der Unix-Administrator vorrangig vom Kommandozeilentool grep, der Programmierer von (ähnlich zu grep arbeitenden) Suchbefehlen und der Webprogrammierer z.B. von mod_rewrite. Die folgende Beschreibung zur Verwendung von regulären Ausdrücken stammt aus der Linux-manpage man grep. Ich habe diese vor allem deswegen abgetrennt, weil man diese "Bedienungsanleitung" eben nicht nur für grep verwenden kann und die zugehörige manpage doch erdrückend groß war ;)
Nachfolgend kommt ein unter der GPL stehender Auszug aus der Manpage zum Befehl grep.

Reguläre Ausdrücke

Unter einem regulären Ausdruck versteht man ein Muster, das eine bestimmte Menge von Zeichenketten beschreibt. Reguläre Ausdrücke werden ganz ähnlich aufgebaut wie arithmetische Ausdrücke, indem man sie mit Hilfe verschiedener Operatoren aus kleineren Ausdrücken zusammensetzt.

Grep versteht zwei verschiedene Klassen regulärer Ausdrücke: "gewöhnliche" und "erweiterte". Eine Unterscheidung, die für GNU grep keine Rolle spielt, da beide Varianten gleich mächtig sind. In anderen grep-Implementierungen steht mit gewöhnlichen regulären Ausdrücken jedoch nur ein eingeschränkter Funktionsumfang zur Verfügung. Die folgende Beschreibung bezieht sich auf erweiterte reguläre Ausdrücke; die Unterschiede zu gewöhnlichen regulären Ausdrücken sind im Anschluss daran zusammengefasst.

Allgemeingültiges

Grundlegendster Baustein sind die regulären Ausdrücke, die auf ein einzelnes Zeichen passen. Die meisten Zeichen, speziell alle Buchstaben und Ziffern, sind zugleich reguläre Ausdrücke, die auf sich selbst passen. Alle Metazeichen, die eine besondere Bedeutung besitzen, können durch einen vorausgehenden Rückstrich geschützt werden.

Eine Liste von Zeichen, die durch [ und ] eingeschlossen ist, passt auf ein beliebiges Zeichen daraus. Beginnt die Liste mit dem Symbol ^, so kehrt sich die Bedeutung um; sie passt auf alle Zeichen, die nicht in der Liste enthalten sind. Beispielsweise passt der reguläre Ausdruck [0123456789] auf eine beliebige einzelne Ziffer. Ein ganzer Bereich von Zeichen kann angegeben werden durch das erste und letzte Zeichen daraus, verbunden durch einen Bindestrich. Schließlich gibt es noch eine Reihe vordefinierter Klassen von Zeichen, im einzelnen: [:alnum:] (Buchstaben und Ziffern), [:alpha:] (Buchstaben), [:cntrl:] (Steuerzeichen), [:digit:] (Ziffern), [:graph:] (graphische Zeichen, das heißt [:alnum:] und [:punct:]), [:lower:] (Kleinbuchstaben), [:print:] (druckbare Zeichen), [:punct:] (Satzzeichen), [:space:] (Leerraum), [:upper:] (Großbuchstaben) und [:xdigit:] (Ziffern des Hexadezimalsystems). So bedeutet beispielsweise [[:alnum:]] für gewöhnlich dasselbe wie [0-9A-Za-z], jedoch hängt die zweite Form ab von der POSIX-Ländereinstellung und ASCII-Kodierung der Zeichen, während die erste Form davon unabhängig ist. (Man beachte, dass die eckigen Klammern Teil des symbolischen Namens der einzelnen Klassen sind. Zusätzlich dazu müssen noch die eckigen Klammern angegeben werden, die eine Liste von Zeichen begrenzen.) Die meisten Metazeichen verlieren innerhalb einer Zeichenkette ihre besondere Bedeutung. Um ein ] selbst zu beschreiben, muss es an erster Stelle der Kette gesetzt werden. Soll ^ als gewöhnliches Zeichen auftreten, darf es nicht an erster Stelle stehen. Das Zeichen - selbst muss an letzter Stelle der Kette auftauchen.

Der Punkt . passt auf jedes beliebige, einzelne Zeichen. Das Symbol \w ist ein Synonym für [[:alnum:]], \W ein Synonym für [^[:alnum]].

Das Dach ^ und das Dollarzeichen $ sind Sonderzeichen, die auf die leere Zeichenkette am Anfang beziehungsweise Ende einer Zeile passen. Ganz ähnlich passen die Symbole \< und \> auf die leere Zeichenkette am Anfang beziehungsweise Ende eines Wortes. Das Symbol \b passt auf die leere Zeichenkette an einem Wortrand; \B bezeichnet das Gegenteil davon und passt auf die leere Zeichenkette, falls die sich nicht an einem Wortrand befindet.

Ein regulärer Ausdruck kann gefolgt werden von einem oder mehreren Wiederholungsoperatoren:
  • ? Das vorhergehende Objekt ist optional und tritt höchstens einmal auf.
  • * Das vorhergehende Objekt tritt kein Mal oder beliebig oft auf.
  • + Das vorhergehende Objekt tritt ein- oder mehrmals auf.
  • {n} Das vorhergehende Objekt tritt genau n-mal auf.
  • {n,} Das vorhergehende Objekt tritt mindestens n-mal oder öfter auf.
  • {n,m} Das vorhergehende Objekt tritt mindestens n- und höchstens m-mal auf.
Zwei reguläre Ausdrücke können aneinander gefügt werden. Der entstehende reguläre Ausdruck passt auf jede Zeichenkette, die aus zwei aneinander gesetzten Teilketten besteht, sofern jede der Teilketten auf den zugehörigen regulären Teilausdruck passt.

Sind zwei reguläre Ausdrück durch den Infix-Operator | verbunden, so passt der gesamte reguläre Ausdruck auf jede Zeichenkette, die auf mindestens einen der beiden Teilausdrücke passt.

Wiederholungsoperatoren besitzen höhere Priorität als eine Aneinanderreihung. Am niedrigsten ist die Priorität der Alternative. Einzelne Teilausdrücke können in Klammern gesetzt werden, um diese Regeln explizit abzuändern.

Die Rückwärtsreferenz \n - wobei n für eine einzelne Ziffer steht -, passt auf die Zeichenkette, die wiederum auf den vorhergehenden, eingeklammerten Teilausdruck Nummer n des regulären Ausdrucks gepasst hat.

In gewöhnlichen regulären Ausdrücken besitzen die Metazeichen ?, +, {, }, |, ( und ) keine besondere Bedeutung. Statt dessen können die mit einem Rückstrich geschützten Versionen \?, \+, \{, \}, \|, \( und \) verwendet werden.

Eigenheiten bei grep

Das Metazeichen { wurde im ursprünglichen egrep nicht unterstützt. Andere Implementierungen unterstützen statt dessen \{, so dass portable Skripte { in egrep-Mustern generell vermeiden sollten. Als Alternative kann [{] verwendet werden, um das Zeichen { selbst zu beschreiben.

GNU egrep versucht, das ursprüngliche Verhalten zu unterstützen indem es annimmt, dass { keine besondere Bedeutung besitzt, falls es eine ungültige Intervallbeschreibung einleiten würde. So sucht beispielsweise das Kommando egrep '{1' nach der zwei Zeichen langen Zeichenkette {1, statt einen fehlerhaften regulären Ausdruck zu melden. Dieses Verhalten ist in POSIX.2 als Erweiterung erlaubt. Portable Skripte sollten darauf jedoch nicht vertrauen.