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.
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. '}'
|
|
|