[ Vorherige ] [ Seiten ] [ Weiter ]

04 Theoretische Informatik

Angelegt Mittwoch 26 Juli 2023


Mini-Tutorial für NPP-RegEx


Beispiel Autokennzeichen

Regulärer Ausdruck für Notepad++:
[A-Z][A-Z][A-Z]?-[A-Z][A-Z]\s[0-9]+

Interpretation:
[A-Z] Exakt ein Zeichen aus der Gruppe A-Z
[A-Z]? Das Zeichen aus der Gruppe A-Z kommt ein- oder keinmal vor.
- Bindestrich (kein Spezialzeichen)
\s Leerzeichen (kann auch Tab oder andere Whitespace sein)
[0-9]+ Das Zeichen aus der Gruppe 0-9 kommt ein- oder mehrmals vor

Das Kennzeichen ST-FG 345 wird erkannt
Das Kennzeichen STA-AT 35 wird erkannt
Das Kennzeichen STA-A 35 wird nicht erkannt
Das Kennzeichen STA-ATA 35 wird nicht erkannt
Das Kennzeichen STA-at 35 wird je nach Einstellung (Groß/Klein beachten) erkannt
Das Kennzeichen STAT-AT 35 wird unvollständig erkannt
Das Kennzeichen D-AT 35 wird nicht erkannt
Das Kennzeichen STA-AT 352342342 wird erkannt

Der Beispiel RegEx ist also nicht perfekt für deutsche Kennzeichen.
Verbesserungsvorschläge:
1• Der "Landkreis" zu Beginn darf auch aus einem Buchstaben bestehen
2• Die Buchstabenfolge in der Mitte hat ein oder 2 Buchstaben
3• Die Zahl am Ende ist ein- bis vierstellig
4• Optional kommt am Ende ein H oder E
5• Spaces zu Beginn und am Ende
6• Weitere Sonderfälle https://de.wikipedia.org/wiki/Kfz-Kennzeichen_(Deutschland)

1•  [A-Z][A-Z]?[A-Z]?-[A-Z][A-Z]\s[0-9]+
2•  [A-Z][A-Z]?[A-Z]?-[A-Z][A-Z]?\s[0-9]+
3•  [A-Z][A-Z]?[A-Z]?-[A-Z][A-Z]?\s[0-9][0-9]?[0-9]?[0-9]?
4•  [A-Z][A-Z]?[A-Z]?-[A-Z][A-Z]?\s[0-9][0-9]?[0-9]?[0-9]?[EH]?
5•  \s[A-Z][A-Z]?[A-Z]?-[A-Z][A-Z]?\s[0-9][0-9]?[0-9]?[0-9]?[EH]?\s

Das Kennzeichen D-AT 35H wird erkannt
Das Kennzeichen D-AT 35E wird erkannt
Das Kennzeichen D-AT 35EH wird nicht erkannt
Das Kennzeichen DDDDDD-AT 35E wird nicht erkannt

Beispiel E-Mail Adresse

Regulärer Ausdruck für Notepad++:
[\-\.!\w][-\.!\w]*@([\u\l\d][\u\l\d\-]*[\u\l\d]\.)+[\u\l]{2,4}
(Grammatik für E-Mail-Adressen wurde aus dem Skript "formale Sprachen genommen")

frank.toens@schule.duesseldorf.de
aa@b.com
aa@bb.com
aa@bb.cc.dd.de
aa@ba.cb.dc.d
a@bb.cc.dd.de

Beispiel Tagesdatum

Regulärer Ausdruck für Notepad++: \d\d\.\d\d\.\d\d\d\d

Das Datum 01.02.2002 wird erkannt
Das Datum 41.02.0009 wird erkannt
Das Datum 1.02.0009 wird nicht erkannt

Verbesserung:
\s([0-2]?[\d]|3[01]?)\.[0-1]?\d\.\d\d\d\d


Referenz

Metazeichen: [ ] ( ) { } | ? + - * $ \ . ^

Benutzung von eckigen Klammern (Zeichenklassen) bzw. speziellen Zeichenklassen
* [A-Z] bezeichnet EINEN Buchstaben aus der Menge A-Z
* [^A-Z] bezeichnet KEINEN Buchstaben aus der Menge A-Z. 
        Achtung: Dann hat man auch Sonderzeichen wie Newline drin!
* \l einen Kleinbuchstaben
* \u einen Großbuchstaben
* \s ein Whitespace-Zeichen
* \d ein Digit (Ziffer)
* \w ein "Wort"-Zeichen, d.h. [_\d\l\u]
* \x20 findet das Zeichen mit Ascii-Code 20(Hex), also normales Space
* . irgendein Zeichen. Beispiel: \x20\d.\d\x20 findet alle Vorkommen der Art 3a4 oder 3-4

Runde Klammern sind "Capture Groups", denen man auch Namen für spätere Nutzung geben kann. 
Bei einfacher Nutzung aber nützlich z.B. für "oder"-Konstruktionen
* Die Regex S(ipp|chlepp|äck)e findet Sippe Schleppe und Säcke.

Multiplikatoren, die sich auf ein vorangehendes Symbol beziehen
* * kein-, ein- oder mehrmaliges Auftreten
* + ein- oder mehrmaliges Auftreten
* ? kein- oder einmaliges Auftreten
* {5} fünfmaliges Auftreten
* {5,} mindestens fünfmaliges Auftreten
* {5,7} fünf- bis siebenmaliges Auftreten

Positionierung innerhalb einer Zeile:
* ^ Zeilenstart. D.h. die RegEx ^\x20+ findet alle Zeilen, die mit einem oder mehreren Leerzeichen anfangen
* $ Zeilenende. D.h. die RegEx \x20+$ findet alle Zeilen, die mit einem oder mehreren Leerzeichen anfangen

Verbatim-Mode
* \Q Start und \E Ende des "verbatim mode". Beispiel \Q\*+\Ea+ matches \*+aaaa.

Verbindung mit der theoretischen Informatik

Die Grammatik (S und B Nichtterminale)
S -> aS | aB
B -> b
erzeugt die folgende Sprache:
ab
aab
aaab usw.

Ein dazu passender Regulärer Ausdruck wäre:
a*b

Ein regulärer Ausdruck ist eine Art Kurzform einer Grammatik. Anwendung ist oft die Suche nach Mustern (also nach Wörtern der regulären Sprache) in langen Texten. Da reguläre Sprachen durch einen DEA (deterministischer endlicher Automat) erkannt werden können, und die Laufzeitkomplexität eines DEA in der Komplexitätsklasse O(n) liegt, ist eine solche Suche effizient durchführbar (im Gegensatz zum Parsing-Schritt bei echten Programmiersprachen).


Beispiel: Suche nach dem Wort "Max" im Text "Das Maximum" mit naiver Suche benötigt ___ Schritte.


In der Praxis gibt es bei regulären Ausdrücken noch "Zusatzfunktionen", die nicht "echt regulär" (im Sinne der Theoretischen Informatik) sind.


Aufgaben

A1) Erkläre, wass bei der "Verbesserung" des Regulären Ausdrucks für das Tagesdatum oben genau verbessert wird.
A2) Formuliere einen Regulären Ausdruck für Doppelnamen wie "Reifenberger-Golm"
A3) Formuliere einen Regulären Ausdruck für ein Tagesdatum der Form "11. September 2001" oder "31. Dezember 2012"



Quellen

https://npp-user-manual.org/docs/searching/#regular-expressions
https://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck