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