SelfLinux Programmierung Reguläre Ausdrücke Abschnitt 4 | SelfLinux-0.13.0

| Reguläre Ausdrücke | Autor Formatierung GFDL

#### 4 Und los geht's

Reiht man ein paar Zeichen aneinander, so stehen diese zunächst jeweils für sich selbst. abc findet also alles, was erst ein a dann ein b und schließlich ein c enthält - in genau dieser Reihenfolge und ohne sonstige Zeichen dazwischen. Zugegeben, das bekommt wohl auch jeder bessere Texteditor auf die Reihe.

Will man an einer Stelle mehrere alternative Zeichen finden, kann man das mit Hilfe von eckigen Klammern realisieren. [aeiou] findet also Vokale und H[au]nd sowohl die Hand als auch den besten Freund des Menschen (und Wörter, die diese Wörter enthalten).

Wenn Zeichen eine vorgegebene Reihenfolge haben (wie z.B. Buchstaben durch das Alphabet), so kann man auch Zeichenbereiche benennen. [3-9] findet alle Ziffern im Bereich von 3 bis 9, [A-Z] alle Großbuchstaben.

Interessant ist auch die Möglichkeit, Zeichen auszuschließen. Man stellt dazu ein ^ hinter die öffnende eckige Klammer. A[^r]t findet also die Art (und derartige Zusammensetzungen) nicht, sehr wohl aber das Amt oder die Abtei. Genauso funktioniert das natürlich auch bei Zeichenbereichen (z.B. [^0-9] um Ziffern auszuschließen).

Eine Suche nach einer beliebigen Zeichenkette (in Mustern per *) lässt sich in regulären Ausdrücken per .* realisieren. Dies ist ein zusammengesetzter Ausdruck. Der Punkt steht nämlich für ein einzelnes beliebiges Zeichen. Der Stern dient als Wiederholungsoperator, d.h. durch ihn gilt das vorangehende Zeichen (hier der Punkt) nicht bloß einmal, sondern beliebig oft (oder nie).

Der Stern ist aber nur eine Spezialform der Wiederholung. Die allgemeine Form wird mit geschweiften Klammern geschrieben. Sie schließen zwei durch ein Komma getrennte Zahlen ein, die angeben, wie oft das jeweilige Zeichen wiederholt werden darf. a{2,5} meint beispielsweise 2 bis 5 a's hintereinander. Man kann die zweite Zahl auch weglassen. a{2,} bedeutet dann zwei oder mehr aufeinander folgende a's. Lässt man schließlich noch das Komma weg, handelt es sich um eine genaue Angabe der Wiederholungen. a{2} bedeutet also exakt zwei a's hintereinander.

Der Stern ist folglich eine Abkürzung für {0,}, analog steht das Fragezeichen ? für {0,1} und das Plus + für {1,}. Noch einmal deutlich: ? heißt, das Zeichen darf ein Mal stehen muss aber nicht (also höchstens ein Mal). + heißt, das Zeichen muss mindestens ein Mal stehen.

All diese Sprachelemente kann man auch miteinander kombinieren. [0-9]{5} hilft beispielsweise beim Auffinden von Postleitzahlen. (Wobei natürlich erstmal auch längere Zahlen gefunden werden; wir lernen auch noch, das zu verhindern) Beim Kombinieren muss man ab und an eine Reihenfolge festlegen. Dabei helfen uns runde Klammern.
Ein Beispiel:
bla+se findet 'blase', 'blaase', 'blaaase' usw.
Möchte man hingegen
'blase', 'blablase', 'blablablase' etc. finden, schreibt man (bla)+se.

Die Klammern sorgen dafür, dass sich die Wiederholung nicht bloß auf das Zeichen vor dem Plus bezieht (hier das a) sondern auf die ganze Silbe. Das funktioniert natürlich mit allen Operatoren.

Alternativen trennt man durch einen senkrechten Strich voneinander ( `AltGr+``<`). (Schloss|B[ue]rg) erkennt also sowohl das Schloss als auch die Burg und den Berg. Im Gegensatz zur eckigen Klammer kann man so nicht bloß alternative Zeichen angeben, sondern auch Auswahlmöglichkeiten zwischen kompletten regulären Ausdrücken. (Übrigens: die runden Klammern sind in diesem Beispiel zunächst nicht wichtig, sie sind jedoch später von Bedeutung um die Alternative zu begrenzen, wenn sie selbst nur ein Teilausdruck ist, wie im Superman-Beispiel am Ende des Artikels.)

Für kommende Experten sind auch die so genannten Backreferences (also Rückbezüge) unverzichtbar. Ein Beispiel: ([a-z])\1\1 findet drei gleiche aufeinander folgende Kleinbuchstaben, wie in Schifffahrt oder Seeelefant.

Die Eins steht dabei für das im ersten runden Klammerpaar gefundene Zeichen. Im Gegensatz zu den Wiederholungsoperatoren benennt der Rückbezug also das, was konkret gefunden wurde. Backreferences beziehen sich immer auf Ausdrücke in runden Klammern. Man kann bis zu neun von ihnen in einem Ausdruck verwenden. Sie sind von \1 bis \9 nummeriert; gezählt wird von links nach rechts. Bei Verschachtelungen sind die öffnenden Klammern ausschlaggebend.

Für den Fall, dass man den Suchbegriff am Anfang oder Ende der Zeile verankern möchte, stehen in regulären Ausdrücken die Zeichen ^ und $ zur Verfügung. Der Suchbegriff "toll" findet sowohl die Zeilen 'toll' als auch 'tolles Beispiel' sowie 'richtig tolles Beispiel' und 'alle(s) toll'. ^toll kann sich hingegen nur mit den ersten beiden Möglichkeiten anfreunden, toll$ nur mit der ersten und der letzten und ^toll$ nur mit der ersten.

Was für Zeilen funktioniert, geht natürlich auch auf Wortebene. "car" könnte beispielsweise 'car', 'cartoon', 'oscar' und 'scary' finden. \<car gibt sich jedoch nur mit 'car' und 'cartoon' zufrieden. car\> mag nur 'car' und 'oscar'. \<car\>" verlangt schließlich ausdrücklich 'car'. Zu erwähnen wäre noch \b, dass sowohl auf Wortanfang als auch -ende passt und \B, dass überall da passt, wo \b das nicht tut.

#### 4.1 Übersicht

Nun folgt wie versprochen eine Übersicht über die Sprachmittel von ERE und BRE. Die Möglichkeiten, die sich in der GNU-Implementierung ergeben, aber so nicht im entsprechenden POSIX-Standard gefordert werden, sind durch -1- gekennzeichnet.

BRE | ERE | Bedeutung
--- | --- | ---
xy | xy | Ein 'x' gefolgt von einem 'y'
. | . | Ein beliebiges Zeichen
[xyz] | [xyz] | Ein 'x' oder ein 'y' oder ein 'z'
[a-z] | [a-z] | Ein beliebiges Zeichen, das in der Sortierreihenfolge (in diesem Fall das Alphabet) zwischen 'a' und 'z' liegt; 'a' und 'z' gelten ebenfalls
[^xyz] | [^xyz] | Ein beliebiges Zeichen, außer 'x', 'y' und 'z'
a\{2,5\} | a{2,5} | zwei bis fünf mal 'a' (hintereinander)
a\{2,\} | a{2,} | zwei mal 'a' oder öfter
a\{2\} | a{2} | genau zwei mal 'a'
a* | a* | beliebig oft 'a' (also auch kein mal)
a\+ -1- | a+ | mindestens ein mal 'a'
a\? -1- | a? | höchstens ein mal 'a'
\(...\) -1- | (...) | Klammern legen die Reihenfolge der Operationen fest (und die Zählung für Rückbezüge)
a\|b -1- | a|b | entweder 'a' oder 'b' (a und b können auch zusammengesetzte Ausdrücke sein)
\1 .. \9 | \1 .. \9 -1- | Rückbezüge
^ | ^ | Zeilenanfang (am Anfang des Ausdrucks)
$ | $ | Zeilenende (Am Ende des Ausdrucks)
\< -1- | \< -1- | Wortanfang
\> -1- | \> -1- | Wortende
\b -1- | \b -1- | Wortanfang oder -ende
\B -1- | \B -1- | Weder Wortanfang noch -ende
\. \* \[ \] \+ \? | \. \* \[ \] \+ \? | Jeweils das Zeichen '.', '*', '[', ']', '+' bzw. '?'
( ) | { } | \( \) \| \{ \} | Jeweils das Zeichen '(', ')', '|', '{' bzw. '}'