Teil 04: Konkatenation, Alternation, Unterausdruecke
Nachdem ihr nun mit egrep und dem Escapen der dort geltenden Zeichen mit Sonderbedeutung vertraut seid, kommen wir nun zu den ersten Operatoren. Diese machen egrep maechtiger als fgrep.
Konkatenation
Der einfachste Operator in REs ist die Konkatenation. Auf Deutsch: die Aneinandereihung. Der Operator ist deshalb einfach, weil er implizit ist. Wenn wir zwei Ausdruecke hintereinander schreiben, dann bilden sie damit einen groesseren Ausdruck. Es gibt kein Operator(meta)zeichen, das wir verwenden muessten.
Beispielsweise ist ``Schwaben'' ein Ausdruck, den wir mit egrep in der Datei schwaebische-kunde.txt matchen koennen. Gleichermassen ist ``streiche'' ein solcher Ausdruck. Diese beiden koennen wir auch einfach hintereinanderstellen, um einen konkatenierten Ausdruck zu bilden: ``Schwabenstreiche''.
Das mag trivial klingen, trotzdem ist es ganz gut, sich das zu vergegenwaertigen. Im kleinsten Fall ist ein Ausdruck ein einziges Zeichen. So ist der Ausdruck ``Schwaben'' ja auch schon eine Konkatenation von acht einzelnen Ausdruecken mit je einem literalen Zeichen.
Eine Stringsuche ist auch nur eine Konkatenation literaler Zeichen. Derart waren all die Aufgaben der vorigen Einheit. Die Moeglichkeiten der Stringsuche enden dort; bei uns geht es jetzt erst richtig los!
Alternation
Der zweite (und erste wirklich interessante) Operator ist die Alternation, die zwei Ausdruecke in eine Oder-Beziehung setzt. Wenn ich also mit einem Ausdruck sowohl ``Schwabe'' als auch ``Held'' suchen will, dann kann ich die beiden Ausdruecke per Alternation verbinden.
Die Alternation wird durch den Operator Pipe (|) angegeben. Das Pipe-Zeichen ist also ein Sonderzeichen. Tritt es in der RE auf, dann wird es als Operator interpretiert. Will man es literal matchen, dann muss man es escapen. (Achtung: Je nach RE-Variante kann das auch umgekehrt sein.)
Der Regulaere Ausdruck fuer die erwaehnte Suche waere damit:
Code: Alles auswählen
Schwabe|Held
Code: Alles auswählen
Spiess|Saebel|Pfeil|Schwerdt
Unterausdruecke
Um nicht nur eine Ebene von Alternation zu haben, sondern diese verschachteln zu koennen, brauchen wir eine Moeglichkeit, einen komplexen Ausdruck als Einheit zu betrachten. Das geht indem wir ihn in runde Klammern einfassen.
Runde Klammern ( und ) sind also Sonderzeichen. Wenn sie in der RE auftreten, dann werden sie als Metazeichen interpretiert. Will man sie literal matchen, dann muss man sie escapen. (Achtung: Je nach RE-Variante kann das auch umgekehrt sein.)
Wir koennten die Ausdruecke zwar immer auch ausschreiben, aber es ist weniger Schreibarbeit wenn wir gleiche Teile aus der Klammer rausziehen koennen.
Nehmen wir beispielsweise alle Kombinationen von einem zu- und abnehmenden Mond bzw. Wind. Ausgeschrieben koennte man das folgendermassen zu einem Regulaeren Ausdruck zusammenbauen:
Code: Alles auswählen
zunehmender Mond|abnehmender Mond|zunehmender Wind|abnehmender Wind
Code: Alles auswählen
(zu|ab)nehmender (Wind|Mond)
Man kann Alternationen auch Schachteln:
Code: Alles auswählen
Erd(apfel|birne)|Kartoffel
Das bisher Gelernte nochmal kompakt beschrieben
Hier ein etwas angepasster und mit Anmerkungen versehenen Ausschnitt aus der Manpage regex(7), der unseren Wissensstand bis zum aktuellen Punkt zusammenfasst:
(Die Luecken in dieser Beschreibung koennen wir in den naechsten Einheiten nach und nach fuellen.)A Regular Expression is one or more branches, separated by '|'.
It matches anything that matches one of the branches.
[= Alternation]
A branch is one or more pieces, concatenated. It matches a match
for the first, followed by a match for the second, etc.
[= Konkatenation]
A piece is an atom [...].
An atom is a regular expression enclosed in "()" (matching a
match for the regular expression) [= Unterausdruck],
[...],
a '\' followed by one of the characters "^.[$()|*+?{\"
(matching that character taken as an ordinary character)
[= escapetes Metazeichen das dann literal interpratiert wird],
[...],
or a single character
with no other significance (matching that character)
[= Literal].
[...]
Aufgaben:
1) Schreibe einen egrep-Ausdruck, der sowohl eine Alternation enthaelt als auch das Pipezeichen literal matcht und wende ihn auf einen dazu passenden Eingabetext an.
2) Finde ein inhaltlich sinnvolles Beispiel fuer eine zwei- oder dreifach verschachtelte Alternation.
3) Schreibe einen egrep-Ausdruck (nur mit Alternation und Unterausdruecken), um die Schreibweisen Maier, Meier, Mayer, Meier zu matchen.
4) Ergaenze (3) um die Schreibeweise Myer.
5) Finde alternative Ausdruecke fuer (3) und (4) (ohne andere RE-Operatoren zu verwenden, sondern nur indem du anders gruppierst).
6) Versuche diese Aufgaben auch mit fgrep umzusetzen. Was sind deine Erkenntnisse?
7) Braucht man runde Klammern um den gesamten Ausdruck wenn man eine Alternation (auf oberster Ebene) verwendet?