Sie sind auf Seite 1von 3

Algebra der regulären Ausdrücke Algebra der regulären Ausdrücke

Motivation Basismengen

Reguläre Ausdrücke (regular expressions) sind neben den formalen Grammatiken Die Algebra der regulären Ausdrücke ist gegeben durch RA = (BR, KR, OR, GR) mit
eine weitere Methode zum Beschreiben von Mengen von Wörtern über einer
endlichen Menge von Symbolen. Sie erlauben einfach gebaute Wortmengen kürzer BR = { S, S*, R, P(S*) }
und einfacher zu notieren als mit Hilfe einer formalen Grammatik. Aus diesem
wobei S eine endliche Menge von Symbolen (oder Zeichen), S* die Menge aller
Grunde haben regulären Ausdrücke vielfältige Anwendungen in der Informatik, z.B.
Ketten von Symbolen (der Wörter über den Symbolen), R die Menge der regulären
in Editoren gefunden. Aber auch viele moderne Programmiersprachen (insbe-
Ausdrücke und P(S*) die Potenzmenge zur Menge der Symbolketten ist. Die Menge
sondere Skriptsprachen)— wie z.B. Perl — erlauben die Verwendung regulärer
R wird später definiert.
Ausdrücke als eingebautes Sprachmittel.
KR = { !S* , !R , " }
Reguläre Ausdrücke entstanden aus den in den 50er Jahren des letzten Jahrhun-
derts von Stephen Kleene beschriebenen „regulären Mengen”. Um 1968 wurde von d.h. ausgezeichnete Elemente der Algebra sind der leere String !S* # S*, der leere
Ken Thompson — einem der Erfinder von Unix — ein auf diesen „regulären reguläre Ausdruck !R # R und die leere Menge " # P(S*) .
Mengen” basierender Suchalgorithmus in den Texteditor ed eingebaut. Aufgrund der
vielfältigen Verwendbarkeit entwickelte sich daraus das eigenständige Programm
grep (global regular expression print).

Horst Hansen FHTW Berlin 2007 Horst Hansen FHTW Berlin 2007
Regulaere Ausdruecke 1/12 Regulaere Ausdruecke 2/12

Algebra der regulären Ausdrücke Reguläre Ausdrücke


Operationen Interpretationsfunktion
In der Algebra der regulären Ausdrücke gibt es eine Vielzahl von Operationen.
Einige von ihnen kennen wir schon aus der Betrachtung der Wortalgebra.
Die Interpretationsfunktion für reguläre Ausdrücke ist durch
OR = { + : S* x S $ S* — anfügen von Symbolen vollständige Fallunterscheidung wie folgt definiert:
+ : S* x S* $ S* — konkatenieren
L(!R) = { !S* } für !R # R
i:S$R — einfügen
|:RxR$R — vereinigen (“oder”) L(z) = { z } für alle z # S
:RxR$R — konkatenieren
*:R$R — Kleenescher Sternoperator L(r | s ) = L(r) % L(s) für alle r, s # R
L : R $ P(S*) — Interpretationsfunktion } L( rs ) = { xy | x # L(r) , y # L(s) für alle r, s # R }
Jetzt definieren wir die neuen Operationen. L(r*) = { !S* } % L(r) % L(rr) % ... für alle r # R
i : S $ R ist definiert durch i(z) = z für alle z # S.
| : R x R $ R ist definiert durch |(r,s) = r | s für alle r,s # R.
: R x R $ R ist definiert durch (r,s) = rs für alle r,s # R.
* : R $ R ist definiert durch *(r) = r* für alle r # R.

Horst Hansen FHTW Berlin 2007 Horst Hansen FHTW Berlin 2007
Regulaere Ausdruecke 3/12 Regulaere Ausdruecke 4/12
Reguläre Ausdrücke Algebra der regulären Ausdrücke
Beispiele algebraische Gesetze (Auszug)
Regulärer Ausdruck für eine zweistellige ganze Zahl:
(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9) Identität für die Konkatenation: !R r = r !R = r
Beweis durch Ausrechnen der Interpretationsfunktion: Kommutativität der Vereinigung: r|s=s|r
L(((1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)) = Assoziativität der Vereinigung: (r | s) | t = r | (s | t)
{ xy | x # L(1|2|3|4|5|6|7|8|9) ,
Assoziativität der Konkatenation: (rs)t = r(st)
y # L(0|1|2|3|4|5|6|7|8|9) } =
{ xy | x # { 1,2,3,4,5,6,7,8,9 } , Linksdistributivität der
y # { 0,1,2,3,4,5,6,7,8,9 } } Konkatenation über die Vereinigung: r(s | t) = rs | rt
Rechtsdistributivität der
Konkatenation über die Vereinigung: (s | t)r = sr | tr
Regulärer Ausdruck für eine Dualzahl mit höchstens 4 Stellen ohne führende
Nullen: Idempotenz der Vereinigung: r|r=r
1(0|1)(0|1)(0|1)
Beweis durch Ausrechnen der Interpretationsfunktion.

Horst Hansen FHTW Berlin 2007 Horst Hansen FHTW Berlin 2007
Regulaere Ausdruecke 5/12 Regulaere Ausdruecke 6/12

Reguläre Ausdrücke Reguläre Ausdrücke


Syntaktische Erweiterungen in Unix-Umgebungen Syntaktische Erweiterungen in Unix-Umgebungen

Abkürzungen für Zeichenklassen Sonderzeichen


Zeichenklassen können durch explizite Aufzählung oder durch die Angabe von Sonderzeichen dienen als Hilfsmittel zur Formulierung von Regulären Ausdrücken.
Bereichen definiert werden. Die eckigen Klammern "[" und "]" umschließen eine
Menge von Zeichen (Alternative, nicht Konkatenation!)
^ Zeilenanfang
Beispiele $ Zeilenende
[-+*/] mathematische Operatoren . ein beliebiges Zeichen
[a-z] Kleinbuchstaben \ Fluchtsymbol
[A-Z] Großbuchstaben \\ Backslash
[a-zA-Z] Buchstaben \^ Circumflex
[0-9] Dezimalziffern \$ Dollarzeichen
\. Punkt

Horst Hansen FHTW Berlin 2007 Horst Hansen FHTW Berlin 2007
Regulaere Ausdruecke 7/12 Regulaere Ausdruecke 8/12
Reguläre Ausdrücke Reguläre Ausdrücke
Zusätzliche Operatoren in UNIX-Umgebungen Beispiele mit erweiterter Notation

In Unix-Umgebungen sind oft zusätzlich zwei weitere Operatoren zum Formulieren Beschreibung von natürlichen Zahlen in Dezimalschreibweise ohne führende Nullen
von Regulären Ausdrücken definiert: [1-9][0-9]* | 0
? optionales Auftreten des Ausdrucks, d.h. höchstens einmal Beschreibung aller Wörter, die alle Vokale in alphabetischer Reihenfolge mindestens
einmal enthalten
+ mindestens einmaliges Auftreten des Ausdrucks
.*a.*e.*i.*o.*u.*

Beschreibung aller Wörter, die auf "ung" enden und am Zeilenende auftreten
Beispiele:
.*ung$
r?s Dieser Reguläre Ausdrück bezeichnet das Gleiche wie s | rs .
Beschreibung aller ganzen Zahlen in Dualzahldarstellung (ohne führende Nullen)
r+ Dieser Reguläre Ausdruck bezeichnet fast das Gleiche wie r*; nur das leere 1[01]* | 0 oder 1(0|1)* | 0
Wort ist in der Wortmenge nicht enthalten.

Horst Hansen FHTW Berlin 2007 Horst Hansen FHTW Berlin 2007
Regulaere Ausdruecke 9/12 Regulaere Ausdruecke 10/12

Reguläre Ausdrücke Reguläre Ausdrücke


Anwendung in Unix-Programmen Anwendung in Unix-Programmen
Editoren
Editoren wie "ed" und "vi" erlauben das Suchen nach durch reguläre Ausdrücke Im WS 2006/07 als Beispiele genutzt:
beschriebenen Zeichenketten. grep '^A.*' /usr/share/dict/words
Pattern-Matching-Programme grep ’^[berlin]*$’ /usr/share/dict/words
grep -n ‘.*a.*e.*i.*o.*u.*‘ /usr/share/dict/words
grep ’^[berlin]*$’ /usr/dict/words
grep ‘.*ung$‘ /usr/share/dict/words
Dieses Kommando sucht in der Datei
/usr/dict/words (üblicherweise einem Wörterbuch) alle Wörter, die nur die
grep ‘.*ung$‘ /usr/share/dict/word
Buchstaben aus dem Wort "berlin" beliebig häufig in beliebiger Reihenfolge
grep -o '[1-9][0-9][0-9][0-9]/[0-1][0-9]/[0-3][0-9]' lex.yy.c
enthalten.
Während grep die Operatoren ? und + nicht kennt, können sie in "egrep" verwendet
Textersetzung im vi:
werden.
:%s/<Muster>/<Ersetzungsstring>/gc (interaktiv) oder g (nicht interaktiv)
Auch "awk" erlaubt die Verwendung derartiger regulärer Ausdrücke.
%s/^1/11/gc
Als CGI-Programmiersprache wird heute oft "perl" verwendet, das reguläre %s/^/\(030\)/gc
Ausdrücke als Sprachelement kennt. %s/^\(1.\)/\12/gc

Horst Hansen FHTW Berlin 2007 Horst Hansen FHTW Berlin 2007
Regulaere Ausdruecke 11/12 Regulaere Ausdruecke 12/12