Formale Sprachen und Automaten Kapitel 3: Regular Expressions Vorlesung an der DHBW Karlsruhe Thomas Worsch Karlsruher Institut für Technologie, Fakultät für Informatik Wintersemester 2012
Kapitel 3 Regular Expressions Ein Anwendungsszenario für regular expressions Regular expressions bei egrep Bequemere Notation für reguläre Ausdrücke Metazeichen in Zeichenklassen Anker Gruppierungen und was sie matchen Rückwärtsverweise Verwendung von Metazeichen als reguläre Zeichen Inhalt 2/62
Ein Anwendungsszenario für regular expressions Regular expressions bei egrep Bequemere Notation für reguläre Ausdrücke Metazeichen in Zeichenklassen Anker Gruppierungen und was sie matchen Rückwärtsverweise Verwendung von Metazeichen als reguläre Zeichen Ein Anwendungsszenario für regular expressions 3/62
Einleitung Ein Regular Expression oder kurz Regex bietet die Möglichkeit, eine (nicht zu komplizierte) formale Sprache kompakt zu spezifizieren. Eine Reihe von (Unix-)Werkzeugen und Programmiersprachen erfordern oder erlauben zumindest die Benutzung von Regexes. wörtlich: regulärer Ausdruck, aber allgemeiner als das in Kapitel 2 eingeführte Konzept. hier: keine vollständige Definition von Regex, aber Schritt für Schritt wesentliche Aspekte Vorläufig denke man bei Regex einfach an regulärer Ausdruck. Je nach Werkzeug variieren die konkrete Syntax und/oder die Mächtigkeit der zur Verfügung stehenden Konzepte. hier: grundsätzliche, allgemein gültige Fakten Ein Anwendungsszenario für regular expressions 4/62
Informationen die üblichen Quellen (man pages, etc.) Jeffrey E. F. Friedl: Mastering Regular Expressions David Mertz: http://www.gnosis.cx/publish/ programming/regular_expressions.html Philip Hazel: http://www.pcre.org/ Dokumentation von java.util.regex Ein Anwendungsszenario für regular expressions 5/62
Ein Anwendungsszenario für regular expressions Regular expressions bei egrep Bequemere Notation für reguläre Ausdrücke Metazeichen in Zeichenklassen Anker Gruppierungen und was sie matchen Rückwärtsverweise Verwendung von Metazeichen als reguläre Zeichen Regular expressions bei egrep 6/62
3.1 Anwendungsszenario Gegeben: ein Wort w und ein Regex R Frage: Enthält w ein Teilwort, das durch R beschrieben wird? kurz: Matcht R in w? Beispiel: R = 001 11101 matcht w = 11001001000, denn w enthält (sogar zweimal) das Teilwort 001. Programm egrep Argumente: Regex R und ein (oder mehrere) Dateiname(n) Für jede Zeile der Datei(en) wird geprüft, ob sie als Wort von R gematcht wird. Solche Zeilen werden ausgegeben (oder weiterverarbeitet), alle anderen nicht. Regular expressions bei egrep 7/62
3.2 Beispiele bei egrep: Warnung Es gibt nicht die eine Implementierung von egrep. Details sind verschieden: Dokumentation lesen! Wir beschränken uns auf allgemein Gültiges. Regular expressions bei egrep 8/62
Beispieldatei 0. huo 1. hugo Jede Zeile beginnt mit einer Ziffer und endet mit einem o. Regular expressions bei egrep 9/62
Typischer Aufruf von egrep > egrep hugo liste erstes Argument: Regex weitere Argumente: Dateinamen Achtung: Um zu verhindern, dass die Shell Zeichen wie z. B. * interpretiert, wird der ganze Regex in single quotes... eingeschlossen, die nicht zum Regex gehören. Regular expressions bei egrep 10/62
3.1 Beispiele 0. huo 1. hugo > egrep hugo liste Regular expressions bei egrep 11/62
3.1 Beispiele 0. huo 1. hugo > egrep hugo liste 1. hugo Regular expressions bei egrep 11/62
3.1 Beispiele 0. huo 1. hugo > egrep uo ggg liste Regular expressions bei egrep 12/62
3.1 Beispiele 0. huo 1. hugo > egrep uo ggg liste 0. huo Regular expressions bei egrep 12/62
3.1 Beispiele 0. huo 1. hugo > egrep ggg* liste Regular expressions bei egrep 13/62
3.1 Beispiele 0. huo 1. hugo > egrep ggg* liste Regular expressions bei egrep 13/62
3.1 Beispiele 0. huo 1. hugo > egrep gg(g)* liste Regular expressions bei egrep 14/62
3.1 Beispiele 0. huo 1. hugo > egrep gg(g)* liste Regular expressions bei egrep 14/62
3.1 Beispiele 0. huo 1. hugo > egrep (gg)* liste Regular expressions bei egrep 15/62
3.1 Beispiele 0. huo 1. hugo > egrep (gg)* liste 0. huo 1. hugo Regular expressions bei egrep 15/62
Ein Anwendungsszenario für regular expressions Regular expressions bei egrep Bequemere Notation für reguläre Ausdrücke Metazeichen in Zeichenklassen Anker Gruppierungen und was sie matchen Rückwärtsverweise Verwendung von Metazeichen als reguläre Zeichen Bequemere Notation für reguläre Ausdrücke 16/62
3.3 Abkürzungen Ist R ein regulärer Ausdruck, so schreibt man ε statt O/*, R+ statt RR*, R* statt R * und R+ statt R + R? statt R ε Bequemere Notation für reguläre Ausdrücke 17/62
3.4 Beispiele 0. huo 1. hugo > egrep g+ liste Bequemere Notation für reguläre Ausdrücke 18/62
3.4 Beispiele 0. huo 1. hugo > egrep g+ liste 1. hugo Bequemere Notation für reguläre Ausdrücke 18/62
3.4 Beispiele 0. huo 1. hugo > egrep g? liste Bequemere Notation für reguläre Ausdrücke 19/62
3.4 Beispiele 0. huo 1. hugo > egrep g? liste 0. huo 1. hugo Bequemere Notation für reguläre Ausdrücke 19/62
3.5 Zeichenklassen Für einzelne Zeichen x 1,, x k schreibt man statt x 1 x k kürzer [x 1 x k ]. Bei naheliegender Reihenfolge (Alphabet!) auch noch kürzer [x 1 -x k ]. Bequemere Notation für reguläre Ausdrücke 20/62
3.6 Beispiel für Zeichenklassen Beispiel: [a-z] statt a b c d e f g h i j k l m n o p q r s t u v w x y z. Beispiel: Variablennamen (ohne Unterstriche) in C [a-za-z][a-za-z0-9]* Bequemere Notation für reguläre Ausdrücke 21/62
3.7 Beispiele für Zeichenklassen 0. huo 1. hugo > egrep [defg] liste Bequemere Notation für reguläre Ausdrücke 22/62
3.7 Beispiele für Zeichenklassen 0. huo 1. hugo > egrep [defg] liste 1. hugo Bequemere Notation für reguläre Ausdrücke 22/62
3.7 Beispiele für Zeichenklassen 0. huo 1. hugo > egrep [d-g] liste Bequemere Notation für reguläre Ausdrücke 23/62
3.7 Beispiele für Zeichenklassen 0. huo 1. hugo > egrep [d-g] liste 1. hugo Bequemere Notation für reguläre Ausdrücke 23/62
3.8 Negierte Zeichenklassen Angabe der ausgeschlossenen Zeichen Man schreibt [^x 1 x k ] für die Menge aller Zeichen, ausgenommen x 1,, x k. Bequemere Notation für reguläre Ausdrücke 24/62
3.9 Beispiel für eine negierte Zeichenklasse 0. huo 1. hugo > egrep [^1234hugo. ] liste Bequemere Notation für reguläre Ausdrücke 25/62
3.9 Beispiel für eine negierte Zeichenklasse 0. huo 1. hugo > egrep [^1234hugo. ] liste 0. huo Bequemere Notation für reguläre Ausdrücke 25/62
3.10 Wiederholungshäufigkeiten Es seien x und y nichtnegative ganze Zahlen mit x y. R{x} steht für (R) (R). }{{} x mal R{x,} steht für R{x}R*. R{x, y} steht für (R) (R) (R?) (R?). }{{}}{{} x mal y x mal Bequemere Notation für reguläre Ausdrücke 26/62
Beispiele ε ist äquivalent zu R{0} R ist äquivalent zu R{1} R* ist äquivalent zu R{0,} R+ ist äquivalent zu R{1,} R? ist äquivalent zu R{0,1} Bequemere Notation für reguläre Ausdrücke 27/62
3.11 Beispiele für Wiederholungshäufigkeiten 0. huo 1. hugo > egrep [oguh]{5,} liste Bequemere Notation für reguläre Ausdrücke 28/62
3.11 Beispiele für Wiederholungshäufigkeiten 0. huo 1. hugo > egrep [oguh]{5,} liste Bequemere Notation für reguläre Ausdrücke 28/62
3.11 Beispiele für Wiederholungshäufigkeiten 0. huo 1. hugo > egrep [ouh]{5,} liste Bequemere Notation für reguläre Ausdrücke 29/62
3.11 Beispiele für Wiederholungshäufigkeiten 0. huo 1. hugo > egrep [ouh]{5,} liste Bequemere Notation für reguläre Ausdrücke 29/62
3.11 Beispiele für Wiederholungshäufigkeiten 0. huo 1. hugo > egrep [ogh]{5,} liste Bequemere Notation für reguläre Ausdrücke 30/62
3.11 Beispiele für Wiederholungshäufigkeiten 0. huo 1. hugo > egrep [ogh]{5,} liste Bequemere Notation für reguläre Ausdrücke 30/62
3.12 Punkt Ein einzelner Punkt. steht für ein x-beliebiges Zeichen. Bequemere Notation für reguläre Ausdrücke 31/62
Ein Anwendungsszenario für regular expressions Regular expressions bei egrep Bequemere Notation für reguläre Ausdrücke Metazeichen in Zeichenklassen Anker Gruppierungen und was sie matchen Rückwärtsverweise Verwendung von Metazeichen als reguläre Zeichen Metazeichen in Zeichenklassen 32/62
3.13 Problem Wie notiert man Metazeichen, also - ^ [ ] als normale Zeichen in einer Zeichenklasse? Metazeichen in Zeichenklassen 33/62
3.14 Lösung (jedenfalls manchmal) Mitunter gelten die folgenden Regeln: Ein - unmittelbar nach [ bzw. nach [^ steht für sich Ein ^ nicht unmittelbar nach [ steht für sich Ein ] unmittelbar nach [ bzw. nach [^ steht für sich Ein [ unmittelbar nach [ bzw. nach rx[n steht für sich Metazeichen in Zeichenklassen 34/62
3.15 Beispiele für Metazeichen in Zeichenklassen Die Datei klammern enthalte zwei Zeilen mit jeweils einer Klammer als einzigem Zeichen: [ ] > egrep [[] klammern Metazeichen in Zeichenklassen 35/62
3.15 Beispiele für Metazeichen in Zeichenklassen Die Datei klammern enthalte zwei Zeilen mit jeweils einer Klammer als einzigem Zeichen: [ ] > egrep [[] klammern [ Metazeichen in Zeichenklassen 35/62
3.15 Beispiele für Metazeichen in Zeichenklassen [ ] > egrep []] klammern Metazeichen in Zeichenklassen 36/62
3.15 Beispiele für Metazeichen in Zeichenklassen [ ] > egrep []] klammern ] Metazeichen in Zeichenklassen 36/62
3.15 Beispiele für Metazeichen in Zeichenklassen [ ] > egrep [^[] klammern Metazeichen in Zeichenklassen 37/62
3.15 Beispiele für Metazeichen in Zeichenklassen [ ] > egrep [^[] klammern ] Metazeichen in Zeichenklassen 37/62
3.15 Beispiele für Metazeichen in Zeichenklassen [ ] > egrep [^]] klammern Metazeichen in Zeichenklassen 38/62
3.15 Beispiele für Metazeichen in Zeichenklassen [ ] > egrep [^]] klammern [ Metazeichen in Zeichenklassen 38/62
3.15 Beispiele für Metazeichen in Zeichenklassen [ ] > egrep [^^] klammern Metazeichen in Zeichenklassen 39/62
3.15 Beispiele für Metazeichen in Zeichenklassen [ ] > egrep [^^] klammern [ ] Metazeichen in Zeichenklassen 39/62
Ein Anwendungsszenario für regular expressions Regular expressions bei egrep Bequemere Notation für reguläre Ausdrücke Metazeichen in Zeichenklassen Anker Gruppierungen und was sie matchen Rückwärtsverweise Verwendung von Metazeichen als reguläre Zeichen Anker 40/62
3.16 Problem Gesucht: Matches, die am Anfang der untersuchten Zeichenkette beginnen und/oder am Ende der Zeichenkette enden. Festlegung: Der Anker für den Zeichenkettenanfang ist das ^. Der Anker für das Zeichenkettenende ist das $. Ein Ankersymbol matcht nicht das entsprechende Symbol in der Eingabe, sondern das leere Wort an einer ganz bestimmten Stelle in der Eingabe. Anker 41/62
3.17 Beispiele für Anker 0. huo 1. hugo > egrep ugg liste Anker 42/62
3.17 Beispiele für Anker 0. huo 1. hugo > egrep ugg liste Anker 42/62
3.17 Beispiele für Anker 0. huo 1. hugo > egrep ugg$ liste Anker 43/62
3.17 Beispiele für Anker 0. huo 1. hugo > egrep ugg$ liste Anker 43/62
3.17 Beispiele für Anker 0. huo 1. hugo > egrep ^ugg liste Anker 44/62
3.17 Beispiele für Anker 0. huo 1. hugo > egrep ^ugg liste Anker 44/62
3.17 Beispiele für Anker 0. huo 1. hugo > egrep ggo$ liste Anker 45/62
3.17 Beispiele für Anker 0. huo 1. hugo > egrep ggo$ liste Anker 45/62
Ein Anwendungsszenario für regular expressions Regular expressions bei egrep Bequemere Notation für reguläre Ausdrücke Metazeichen in Zeichenklassen Anker Gruppierungen und was sie matchen Rückwärtsverweise Verwendung von Metazeichen als reguläre Zeichen Gruppierungen und was sie matchen 46/62
Problem Bisher nur die Frage: Matcht ein Regex R in einem Wort w (oder nicht)? Nun die Frage: Matcht ein Regex R in einem Wort w, und wenn ja, wo? Gruppierungen und was sie matchen 47/62
3.18 Beispiele Im Allgemeinen mehrere Stellen, an denen gematcht wird: R = aa bb und w = _aa_bb_ Wird aa gematcht oder bb? R = bb* und w = abbbbc Wird nur ein b gematcht, oder 2 b oder 3 oder 4? R = b bbb und w = abbbc Wird nur b gematcht oder bbb? Gruppierungen und was sie matchen 48/62
3.19 Regel 1: Position des gematchten Textes 1. Ein weiter vorne in der Zeichenkette beginnender exakter Match wird einem weiter hinter beginnenden immer bevorzugt. Diese Regel ist so für (nahezu?) alle Werkzeuge, die mit Regexes umgehen, gültig. Gruppierungen und was sie matchen 49/62
3.20 Regel 2: Länge des gematchten Textes Hier gibt es deutliche Unterschiede; verschiedene Werkzeuge implementieren verschiedene Spezifikationen. 2a. POSIX Spezifikation: Bei gleichem Startpunkt in der Zeichenkette wird ein längerer Match einem kürzeren immer bevorzugt. 2b. Bei einigen anderen Werkzeugen (z. B. Perl): kompliziertere Festlegung des gematchten Textes, dafür einfachere und schnelle Verfahren. Gruppierungen und was sie matchen 50/62
3.21 Beispiele 1. R = aa bb und w = _aa_bb_ Regel 1: das aa wird gematcht und nicht das bb 2. R = bb aa und w = _aa_bb_ Regel 1: das aa wird gematcht und nicht das bb 3. R = bb* und w = abbbbc Regel 2a: das bbbb wird gematcht in diesem Fall matcht z. B. auch Perl noch bbbb 4. R =.* und w beliebig Es wird alles gematcht. Kompliziertere Beispiele kommen gleich. Gruppierungen und was sie matchen 51/62
3.22 Gruppierungen Sinnvolle Teilausdrücke können durch Klammerung mit ( und ) zu einem Unterausdruck zu gruppieren werden. Gruppen dürfen geschachtelt sein. Manchmal gibt es Implementierungsschranken bei der Anzahl von Gruppen insgesamt oder bei der Schachtelungstiefe. Vereinbarung: Gruppe 0 ist der gesamte Regex, auch wenn nicht geklammert wurde. Im Folgenden wird stets angenommen, dass der gesamte Regex nicht geklammert ist. Die Nummern der weiteren Gruppen ergeben sich durch Zählen der öffnenden Klammern bis zur interessierenden Gruppe inkl. Gruppierungen und was sie matchen 52/62
3.23 Beispiele für Gruppierungen R = (bb)c(bb) und w = zzbbcbbz: zzbbcbbz 1 2 0 R = (bb)c*(bb) und w = zzbbcbbzzzbbcccbb: zzbbcbbzzzbbcccbb 1 2 0 Gruppierungen und was sie matchen 53/62
3.24 Beispiel für Gruppierungen R = (.*)(.*) und w = abcdefg Annahme: POSIX-Regeln Gruppierungen und was sie matchen 54/62
3.24 Beispiel für Gruppierungen R = (.*)(.*) und w = abcdefg Annahme: POSIX-Regeln abcdefg 1 0 Gruppierungen und was sie matchen 54/62
3.24 Beispiel für Gruppierungen R = (.*)(.*) und w = abcdefg Annahme: POSIX-Regeln abcdefg 1 0 Die zweite Gruppe matcht nichts, weil die erste ein möglichst langes Teilwort matcht und nichts übrig lässt. Gruppierungen und was sie matchen 54/62
Ein Anwendungsszenario für regular expressions Regular expressions bei egrep Bequemere Notation für reguläre Ausdrücke Metazeichen in Zeichenklassen Anker Gruppierungen und was sie matchen Rückwärtsverweise Verwendung von Metazeichen als reguläre Zeichen Rückwärtsverweise 55/62
3.25 Rückwärtsverweise (engl. back references) erweitern die Möglichkeiten von Regexes deutlich. Nachdem Gruppe i abeschlossen ist, steht das von Gruppe i gematcht wurde. Bei manchen Werkzeugen sind nur einstellige Gruppennummern zulässig. i für das Teilwort, / Rückwärtsverweise 56/62
3.26 Beispiel R = (abc xyz) / 1 Rückwärtsverweise 57/62
3.26 Beispiel R = (abc xyz) 1 matcht abcabc / Rückwärtsverweise 57/62
3.26 Beispiel R = (abc xyz) 1 matcht abcabc matcht xyzxyz / Rückwärtsverweise 57/62
3.26 Beispiel R = (abc xyz) 1 matcht abcabc matcht xyzxyz matcht nicht abcxyz / Rückwärtsverweise 57/62
3.26 Beispiel R = (abc xyz) 1 matcht abcabc matcht xyzxyz matcht nicht abcxyz / Beachte: Unterschied zu (abc xyz)(abc xyz)!!! Rückwärtsverweise 57/62
3.27 Beispiel für Rückwärtsverweise 0. huo 1. hugo 4. huggggo 5. hugggggo 6. huggggggo 7. hugggggggo 8. huggggggggo > egrep ((gg)+)\1 liste2 Rückwärtsverweise 58/62
3.27 Beispiel für Rückwärtsverweise 0. huo 1. hugo 4. huggggo 5. hugggggo 6. huggggggo 7. hugggggggo 8. huggggggggo > egrep ((gg)+)\1 liste2 4. huggggo 5. hugggggo 6. huggggggo 7. hugggggggo 8. huggggggggo Rückwärtsverweise 58/62
3.27 Beispiel für Rückwärtsverweise 0. huo 1. hugo 4. huggggo 5. hugggggo 6. huggggggo 7. hugggggggo 8. huggggggggo > egrep u((gg)+)\1o liste2 Rückwärtsverweise 59/62
3.27 Beispiel für Rückwärtsverweise 0. huo 1. hugo 4. huggggo 5. hugggggo 6. huggggggo 7. hugggggggo 8. huggggggggo > egrep u((gg)+)\1o liste2 4. huggggo 8. huggggggggo Rückwärtsverweise 59/62
3.28 Beispiel für Rückwärtsverweise R = (.*).*( / 1) und w = abcxabca Aufgrund der ersten Regel ist klar, dass der Match auf jeden Fall mit dem ersten Symbol des Wortes beginnt. Aber dann? Rückwärtsverweise 60/62
3.28 Beispiel für Rückwärtsverweise R = (.*).*( / 1) und w = abcxabca Aufgrund der ersten Regel ist klar, dass der Match auf jeden Fall mit dem ersten Symbol des Wortes beginnt. Aber dann? Unter anderem folgende Möglichkeiten: Die erste Gruppe ist maximal gefräßig und matcht abc. Damit ist der Rest des Matches eindeutig festgelegt: Rückwärtsverweise 60/62
3.28 Beispiel für Rückwärtsverweise R = (.*).*( / 1) und w = abcxabca Aufgrund der ersten Regel ist klar, dass der Match auf jeden Fall mit dem ersten Symbol des Wortes beginnt. Aber dann? Unter anderem folgende Möglichkeiten: Die erste Gruppe ist maximal gefräßig und matcht abc. Damit ist der Rest des Matches eindeutig festgelegt: abcxabca 1 2 0 Rückwärtsverweise 60/62
3.28 Beispiel für Rückwärtsverweise R = (.*).*( 1) und w = abcxabca / Aufgrund der ersten Regel ist klar, dass der Match auf jeden Fall mit dem ersten Symbol des Wortes beginnt. Aber dann? Unter anderem folgende Möglichkeiten: Die erste Gruppe ist maximal gefräßig und matcht abc. Damit ist der Rest des Matches eindeutig festgelegt: abcxabca 1 2 0 Die erste Gruppe matcht a,.* ist maximal gefräßig und der Rückwärtsverweis matcht erst am Wortende: Rückwärtsverweise 60/62
3.28 Beispiel für Rückwärtsverweise R = (.*).*( 1) und w = abcxabca / Aufgrund der ersten Regel ist klar, dass der Match auf jeden Fall mit dem ersten Symbol des Wortes beginnt. Aber dann? Unter anderem folgende Möglichkeiten: Die erste Gruppe ist maximal gefräßig und matcht abc. Damit ist der Rest des Matches eindeutig festgelegt: abcxabca 1 2 0 Die erste Gruppe matcht a,.* ist maximal gefräßig und der Rückwärtsverweis matcht erst am Wortende: abcxabca 1 2 0 Rückwärtsverweise 60/62
Ein Anwendungsszenario für regular expressions Regular expressions bei egrep Bequemere Notation für reguläre Ausdrücke Metazeichen in Zeichenklassen Anker Gruppierungen und was sie matchen Rückwärtsverweise Verwendung von Metazeichen als reguläre Zeichen Verwendung von Metazeichen als reguläre Zeichen 61/62
3.29 Symbole O/, (, ), und * haben eine besondere Bedeutung Außerhalb von Zeichenklassen außerdem zumindest., +,?, [, ], { und } sogenannte Metazeichen Problem: Verwendung als Literal? Regel: Um Metazeichen auch als Literale benutzbar zu machen, muss ihnen ein Backslash vorangestellt werden. / Verwendung von Metazeichen als reguläre Zeichen 62/62