5.5 Reguläre Ausdrücke
Wir werden nun eine weitere Weise finden, reguläre Sprachen zu beschreiben: neben regulären Grammatik (ob normal, erweitert, eingeschränkt), endlichen Automaten und nichtdeterministischen endlichen Automaten gibt es noch die regulären Ausdrücke. Dies wird wahrscheinlich von allen Beschreibungsweise die sein, mit der Sie in der Praxis am ehesten in Berührung kommen. Wir haben bereits in Kapitel 4.1 das Baukastenprinzip kennengelernt:
- Wenn
und reguläre Sprachen sind, dann ist auch regulär; - dann ist auch die Konkatenation
regulär; - wenn
regulär ist, dann ist auch ihre Kleenesche Hülle regulär.
Darüberhinaus haben wir Techniken kennengelernt, um aus den gegebenen regulären Grammatiken
eine neue Grammatik für
Damit diese Frage überhaupt die Chance hat, mit ja beantwortet zu werden, müssen wir "Atome" zur Verfügung stellen, mit denen wir beginnen können. Daher:
-
Die Sprachen
, und für jedes sind regulär.
- Atome.
ist ein regulärer Ausdruck und beschreibt die Sprache . ist ein regulärer Ausdruck und beschreibt die Sprache . Jedes einzelne Zeichen ist ein regulärer Ausdruck und beschreibt die Sprache . - Alternative. Wenn
reguläre Ausdrücke über sind und die Sprachen und beschreiben, so ist ein regulärer Ausdruck und beschreibt die Sprache (die regulär ist, wie wir in Kapitel 4.1 gesehen haben). -
Konkatenation.
ist ein regulärer Ausdruck, der die Sprache beschreibt (die auch wiederum regulär ist). Der Deutlichkeit halber schreiben wir auch manchmal . -
Kleenesche Hülle. Wenn
ein regulärer Ausdruck ist und die Sprache beschreibt, dann ist ein regulärer Ausdruck und beschreibt die Sprache .
Weil in der Praxis neben
In konkreten fällen lassen gerne die Klammerung weg, wenn keine Verwechslungsgefahr besteht.
Auch
gehen wir davon aus, dass die Operatoren die Präzedenz
Die von den atomaren Ausdrücken beschriebenen Sprachen sind alle regulär, da sie alle endliche Sprachen sind. Dank unserer Vorarbeit aus Kapitel 4.1 wissen wir, dass Alterantive, Konkatenation und Kleenesche Hülle wiederum reguläre Sprachen erzeugen. Wir erhalten das folgende Ergebnis:
Es ist Zeit für ein paar Beispiele.
bla:bla:blu.xyz-12-ab.b:x
aus dem
letzten Kapitel. Sie erinnern sich:
eine endliche Folge von Labels, wo ein Label eine nichtleere Folge von Blöcken ist, die
entweder :
oder durch -
separiert sind, wobei innerhalb eines Labels
immer nur ein
Separatortyp vorkommen darf, und wobei ein Block eine nichtleere Folge von alphanumerischen
Zeichen ist (wir haben uns dann auf den Buchstaben
Ein Block ist eine nichtleere Folge von :
oder
-
separieren; wir
erhalten den regulären Ausdruck :
oder -
stoßen, entscheiden wir uns für den "Typ" des Labels).
Schlussendlich ist ein Wort in der Sprache eine mit .
separierte Folge von
Labels, also:
java TestRegex
Please enter a regular expression:
(a+)(:a+)*Enter words to be matched, one per line
aaaaa:aa:aaaa:a
true
aaa:aa:
false
Schreiben Sie nun einen regulären Ausdruck
[a-z]
beispielsweise die Menge aller Kleinbuchstaben,
[aoeiuy]
beschreibt die Menge \{a,o,e,i,u,y\} etc.
Der reguläre Ausdruck [a-z]*[aeiuoy][a-z]*
beschreibt also die
Menge aller Wörter, die mindesten einen Vokal enthalten.
Lesen Sie hierfür unter Anderem
und
lassen sich aber bitte nicht von der Menge an Details erschlagen.
Schreiben Sie nun in der Java-Regex-Syntax einen regulären Ausdruck für unsere obige Sprache
Einen regulären Ausdruck für jede reguläre Sprache
Wir beweisen nun das Gegenstück zu Lemma 4.5.2:Wir paraphrasieren hier den Beweis aus Michael Sipsers Introduction to the Theory of Computation.
Definieren wir nun formal, was VNEAs sind und welche Sprache sie akzeptieren:
Für
Einen gegebenen NEA können wir leicht in einen VNEA transformieren, indem wir, soweit nötig,
(1) einen neuen Startzustand kreieren (damit dieser keine eingehenden Kanten hat),
(2) einen neuen Endzustand kreieren,
(3) "parallele" Übergänge wie
Wir haben den ganzen Aufwand betrieben, weil wir für einen VNEA sehr leicht
Zustände eliminieren können. Wenn wir zum Beispiel
Falls die mit
Wir suchen uns also einen Zustand
Dieser VNEA akzeptiert immer noch die gleiche Sprache
Hier sehen Sie den ganzen Ablauf an unserer aaaa:a:aaa.aa-aa
-Sprache: