Reguläre Sprachen können außer durch eine Grammatik auch durch sogenannten reguläre Ausdrücke beschrieben werden.
Reguläre Ausdrücke formuliert man mit regulären Operatoren. Die wichtigsten regulären Operatoren sind die folgenden:
a*
- "a-Stern": a beliebig oft (auch 0 mal) hintereinanderab
- Verkettung: ein a, dann ein ba|b
- Oder: entweder ein a oder ein b()
können Teilausdrücke gruppiert werden
(1) α1 = c*h*
beschreibt alle Zeichenketten, die zunächst aus beliebig vielen Buchstaben c
bestehen und anschließend aus beliebig vielen Buchstaben h
. 1). L1={ε,c,h,ccch,ccchhh,hhhh,cc,…}.
(2) α2 = c*|h*
beschreibt die alle Zeichenketten, die entweder nur aus c
's oder nur aus h
's bestehen. L2={ε,c,h,cc,hh,ccc,hhh,…}.
(3) α3 = (c|h)*
beschreibt die alle Zeichenketten, die aus beliebig vielen c
's und h
's bestehen. L3={ε,c,h,hc,ch,ccc,hchh,…}.
Welche Sprachen werden durch die folgenden regulären Ausdrücke beschrieben? Liste eine Beispielmenge von akzeptierten Wörtern auf, aus der hervorgeht, welche Regeln gelten.
(A) α4 = 01*0
L=
(B) α5 = (01)*
L=
(C) α6 = 0|(10*)*
L=
(D) α7 = (1(110)*)*
L=
(E) α8 = 1(1*|10*)
L=
(F) α9 = 0|1*|10*
L=
(G) α10 = 1*0*(0|1)
L=
Mit der "Minimalausstattung" von drei Operatoren (ohne die Klammern) lassen sich im Prinzip schon alle regulären Ausdrücke schreiben. Bequemer, kürzer und übersichtlicher geht es, wenn man weitere Operatoren hinzunimmt, hier ist allerdings zu beachten, dass es unterschiedliche "Dialekte" solcher Erweiterungen gibt.
Die meisten Programmiersprachen verfügen über Funktionen oder Bibliotheken, um Strings anhand von regulären Ausdrücken zu finden. Meist gibt es auch weitere Funktionen wie Rückbezüge, mit denen sich komplexe Ersetzungen und Ähnliches realisieren lassen.
Typische Erweiterungen umfassen die folgenden Elemente:
[0-9]
bedeutet "die Ziffern von 0 bis 9", [0-9]*
bedeutet entsprechend "beliebig oft eines der Zeichen von 0-9. Bislang hätten wir dafür (0|1|2|3|4|5|6|7|8|9)*
schreiben müssen.[abc]
– der Buchstabe a, b oder c.[a-zA-Z]
– die Buchstaben A bis Z, groß und klein..
2) – ein beliebiges Zeichen.[^abc]
– jedes Zeichen außer den Buchstaben a, b und c 3)[\[a-z\]]
- erst ein [, dann ein Buchstabe a bis z dann ein ].^
gematcht werden, das Ende durch ein $
.*
bedeutet wie bisher, dass beliebig viele Zeichen der vorherigen Gruppe gesucht werden ^[aeiou]*n$
– findet n, an, en, in, on, un, aan, aaan, aen, ein, … sofern sie in einer Zeile stehen.a{2,5}
- 2 bis 5 Vorkommen des Buchstabens a.b+
- mindestens ein Vorkommen des Buchstabens b 4).
Schreibe die Ausdrücke [abc]
, b+
und a{2,4}
mit Hilfe der elementaren regulären Operatoren auf.
Bearbeite das Tutorial unter https://regexone.com/, um mit den erweiterten regulären Operatoren vertraut zu werden.
Auf der Seite https://regex101.com/ kannst du reguläre Ausdrücke testen. Außerdem werden die Ausdrücke und Matches erklärt.
Öffne die Seite https://regex101.com/ und sorge dafür, dass die Einstellungen wie im Screenshot zusehen angepasst sind5)
Überprüfe jetzt deine Ergebnisse aus Aufgabe 1, indem du den regulären Ausdruck in die Eingabezeile "regular Expression" schreibst und die zu testenden Wörter der regulären Sprache in das Feld "Test String", pro Zeile ein Wort.
^
) und Zeilenende ($
) testen, sonst klappts nicht - siehe Screenshot. Probiere einfach aus, was passiert, wenn du diese beiden Zeichen weglässt. Wenn du Groß und Kleinschreibung nicht unterscheiden möchtest, musst du die Option i
für Case-Insensitive setzen.
Füge die etwa 180000 Worte, die in dieser Datei enthalten sind in das "Test String"-Feld bei regex101.com ein.
Formuliere anschließend reguläre Ausdrücke, um die folgenden Wörter zu finden. Groß- und Kleinschreibung soll nicht berücksichtigt werden - siehe oben für die Bedeutung der Option i
.
mc
enthalten (zu erwarten: 35 Treffer)lau
beginnen und danach noch genau einen weiteren Buchstaben enthalten (12 Treffer)L
beginnen und mit cht
enden (31 Treffer)d
, r
oder t
beginnen und mit a
, g
oder l
enden (1258 Treffer)u
enthalten (13749 Treffer)u
enthalten (67 Treffer)t
ist (344 Treffer)a
, e
, i
, o
und u
in dieser Reihenfolge und genau einmal enthalten. (1 Treffer)y
enthalten, aber kein a
. (885 Treffer)
Es soll erkannt werden, ob ein String das korrekte Format für eine Telefonnummer hat.
Für uns soll eine korrekte Telefonnummer zunächst folgende Kriterien aus folgenden Bestandteilen zusammengesetzt sein:
Erstelle einen regulären Ausdruck, der in der folgenden Liste von Ziffernfolgen alle korrekten Telefonnummern erkennt.