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 I
Ein Regular Expression oder kurz Regex bietet die Möglichkeit, eine (nicht zu komplizierte) formale Sprache kompakt zu spezifizieren.
I
Eine Reihe von (Unix-)Werkzeugen und Programmiersprachen erfordern oder erlauben zumindest die Benutzung von Regexes.
I
wörtlich: „regulärer Ausdruck“, aber allgemeiner als das in Kapitel 2 eingeführte Konzept.
I
hier: keine vollständige Definition von Regex, aber Schritt für Schritt wesentliche Aspekte
I
Vorläufig denke man bei „Regex“ einfach an „regulärer Ausdruck“.
I
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 I
die üblichen Quellen (man pages, etc.)
I
Jeffrey E. F. Friedl: „Mastering Regular Expressions“
I
David Mertz: http://www.gnosis.cx/publish/ programming/regular_expressions.html
I
Philip Hazel: http://www.pcre.org/
I
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 I
Gegeben: ein Wort w und ein Regex R
I
Frage: Enthält w ein Teilwort, das durch R beschrieben wird?
I
kurz: „Matcht R in w ?“
I
Beispiel: R = 001|11101 matcht w = 11001001000, denn w enthält (sogar zweimal) das Teilwort 001.
Programm egrep I
Argumente: Regex R und ein (oder mehrere) Dateiname(n)
I
Für jede Zeile der Datei(en) wird geprüft, ob sie als Wort von R gematcht wird.
I
Solche Zeilen werden ausgegeben (oder weiterverarbeitet), alle anderen nicht.
Regular expressions bei egrep
7/62
3.2 Beispiele bei egrep: Warnung I
Es gibt nicht die eine Implementierung von egrep.
I
Details sind verschieden: Dokumentation lesen!
I
Wir beschränken uns auf allgemein Gültiges.
Regular expressions bei egrep
8/62
Beispieldatei
0. 1. 2. 3.
huo hugo huggo hugggo
Jede Zeile beginnt mit einer Ziffer und endet mit einem „o“.
Regular expressions bei egrep
9/62
Typischer Aufruf von egrep
> egrep ’hugo’ liste I
erstes Argument: Regex
I
weitere Argumente: Dateinamen
I
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. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’hugo’ liste
Regular expressions bei egrep
11/62
3.1 Beispiele
0. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’hugo’ liste 1. hugo
Regular expressions bei egrep
11/62
3.1 Beispiele
0. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’uo|ggg’ liste
Regular expressions bei egrep
12/62
3.1 Beispiele
0. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’uo|ggg’ liste 0. huo 3. hugggo
Regular expressions bei egrep
12/62
3.1 Beispiele
0. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’ggg*’ liste
Regular expressions bei egrep
13/62
3.1 Beispiele
0. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’ggg*’ liste 2. huggo 3. hugggo
Regular expressions bei egrep
13/62
3.1 Beispiele
0. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’gg(g)*’ liste
Regular expressions bei egrep
14/62
3.1 Beispiele
0. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’gg(g)*’ liste 2. huggo 3. hugggo
Regular expressions bei egrep
14/62
3.1 Beispiele
0. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’(gg)*’ liste
Regular expressions bei egrep
15/62
3.1 Beispiele
0. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’(gg)*’ liste 0. 1. 2. 3.
huo hugo huggo hugggo
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 I
ε statt / O*,
I
R+ statt RR*,
I
R* statt R * und R+ statt R +
I
R? statt R|ε
Bequemere Notation für reguläre Ausdrücke
17/62
3.4 Beispiele
0. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’g+’ liste
Bequemere Notation für reguläre Ausdrücke
18/62
3.4 Beispiele
0. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’g+’ liste 1. hugo 2. huggo 3. hugggo
Bequemere Notation für reguläre Ausdrücke
18/62
3.4 Beispiele
0. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’g?’ liste
Bequemere Notation für reguläre Ausdrücke
19/62
3.4 Beispiele
0. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’g?’ liste 0. 1. 2. 3.
huo hugo huggo hugggo
Bequemere Notation für reguläre Ausdrücke
19/62
3.5 Zeichenklassen I
Für einzelne Zeichen x1 , · · · , xk schreibt man statt x1 | · · · |xk kürzer [x1 · · · xk ].
I
Bei naheliegender Reihenfolge (Alphabet!) auch noch kürzer [x1 -xk ].
Bequemere Notation für reguläre Ausdrücke
20/62
3.6 Beispiel für Zeichenklassen I
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.
I
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. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’[defg]’ liste
Bequemere Notation für reguläre Ausdrücke
22/62
3.7 Beispiele für Zeichenklassen
0. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’[defg]’ liste 1. hugo 2. huggo 3. hugggo
Bequemere Notation für reguläre Ausdrücke
22/62
3.7 Beispiele für Zeichenklassen
0. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’[d-g]’ liste
Bequemere Notation für reguläre Ausdrücke
23/62
3.7 Beispiele für Zeichenklassen
0. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’[d-g]’ liste 1. hugo 2. huggo 3. hugggo
Bequemere Notation für reguläre Ausdrücke
23/62
3.8 Negierte Zeichenklassen I
Angabe der ausgeschlossenen Zeichen
I
Man schreibt [^x1 · · · xk ] für die Menge aller Zeichen, ausgenommen x1 , · · · , xk .
Bequemere Notation für reguläre Ausdrücke
24/62
3.9 Beispiel für eine negierte Zeichenklasse
0. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’[^1234hugo. ]’ liste
Bequemere Notation für reguläre Ausdrücke
25/62
3.9 Beispiel für eine negierte Zeichenklasse
0. 1. 2. 3.
huo hugo huggo hugggo
> 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 . I
R{x} steht für (R) · · · (R). | {z }
I
R{x,} steht für R{x}R*.
I
R{x, y } steht für (R) · · · (R) (R?) · · · (R?). | {z } | {z }
x mal
x mal
Bequemere Notation für reguläre Ausdrücke
y − x mal
26/62
Beispiele I
ε ist äquivalent zu R{0}
I
R ist äquivalent zu R{1}
I
R* ist äquivalent zu R{0,}
I
R+ ist äquivalent zu R{1,}
I
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. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’[oguh]{5,}’ liste
Bequemere Notation für reguläre Ausdrücke
28/62
3.11 Beispiele für Wiederholungshäufigkeiten
0. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’[oguh]{5,}’ liste 2. huggo 3. hugggo
Bequemere Notation für reguläre Ausdrücke
28/62
3.11 Beispiele für Wiederholungshäufigkeiten
0. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’[ouh]{5,}’ liste
Bequemere Notation für reguläre Ausdrücke
29/62
3.11 Beispiele für Wiederholungshäufigkeiten
0. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’[ouh]{5,}’ liste
Bequemere Notation für reguläre Ausdrücke
29/62
3.11 Beispiele für Wiederholungshäufigkeiten
0. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’[ogh]{5,}’ liste
Bequemere Notation für reguläre Ausdrücke
30/62
3.11 Beispiele für Wiederholungshäufigkeiten
0. 1. 2. 3.
huo hugo huggo hugggo
> 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) I
Mitunter gelten die folgenden Regeln: I I I I
Ein Ein Ein Ein
^ ] [
unmittelbar nach [ bzw. nach [^ steht für sich nicht unmittelbar nach [ steht für sich unmittelbar nach [ bzw. nach [^ steht für sich 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 I
I
Gesucht: Matches, die am Anfang der untersuchten Zeichenkette beginnen und/oder am Ende der Zeichenkette enden. Festlegung: I I
I
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. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’ugg’ liste
Anker
42/62
3.17 Beispiele für Anker
0. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’ugg’ liste 2. huggo 3. hugggo
Anker
42/62
3.17 Beispiele für Anker
0. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’ugg$’ liste
Anker
43/62
3.17 Beispiele für Anker
0. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’ugg$’ liste
Anker
43/62
3.17 Beispiele für Anker
0. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’^ugg’ liste
Anker
44/62
3.17 Beispiele für Anker
0. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’^ugg’ liste
Anker
44/62
3.17 Beispiele für Anker
0. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’ggo$’ liste
Anker
45/62
3.17 Beispiele für Anker
0. 1. 2. 3.
huo hugo huggo hugggo
> egrep ’ggo$’ liste 2. huggo 3. hugggo
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 I
Bisher nur die Frage: Matcht ein Regex R in einem Wort w (oder nicht)?
I
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: I
R = aa|bb und w = _aa_bb_ Wird aa gematcht oder bb?
I
R = bb* und w = abbbbc Wird nur ein b gematcht, oder 2 b oder 3 oder 4?
I
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 I
Sinnvolle Teilausdrücke können durch Klammerung mit ( und ) zu einem Unterausdruck zu gruppieren werden.
I
Gruppen dürfen geschachtelt sein.
I
Manchmal gibt es Implementierungsschranken bei der Anzahl von Gruppen insgesamt oder bei der Schachtelungstiefe.
I
Vereinbarung: Gruppe 0 ist der gesamte Regex, auch wenn nicht geklammert wurde.
I
Im Folgenden wird stets angenommen, dass der gesamte Regex nicht geklammert ist.
I
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 I
R = (bb)c(bb) und w = zzbbcbbz: zzbbcbbz 1 2 0
I
R = (bb)c*(bb) und w = zzbbcbbzzzbbcccbb: zzbbcbbzzzbbcccbb 1 2 0
Gruppierungen und was sie matchen
53/62
3.24 Beispiel für Gruppierungen I
R = (.*)(.*) und w = abcdefg
I
Annahme: POSIX-Regeln
Gruppierungen und was sie matchen
54/62
3.24 Beispiel für Gruppierungen I
R = (.*)(.*) und w = abcdefg
I
Annahme: POSIX-Regeln abcdefg 1 0
I
Gruppierungen und was sie matchen
54/62
3.24 Beispiel für Gruppierungen I
R = (.*)(.*) und w = abcdefg
I
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“.
I
I
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 I
Rückwärtsverweise (engl. back references) erweitern die Möglichkeiten von Regexes deutlich.
I
Nachdem Gruppe i abeschlossen ist, steht /i für das Teilwort, das von Gruppe i gematcht wurde.
I
Bei manchen Werkzeugen sind nur einstellige Gruppennummern zulässig.
Rückwärtsverweise
56/62
3.26 Beispiel I
R = (abc|xyz)/1
Rückwärtsverweise
57/62
3.26 Beispiel I
R = (abc|xyz)/1 I
matcht abcabc
Rückwärtsverweise
57/62
3.26 Beispiel I
R = (abc|xyz)/1 I I
matcht abcabc matcht xyzxyz
Rückwärtsverweise
57/62
3.26 Beispiel I
R = (abc|xyz)/1 I I I
matcht abcabc matcht xyzxyz matcht nicht abcxyz
Rückwärtsverweise
57/62
3.26 Beispiel I
R = (abc|xyz)/1 I I I
I
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. 1. 2. 3. 4. 5. 6. 7. 8.
huo hugo huggo hugggo huggggo hugggggo huggggggo hugggggggo huggggggggo
> egrep ’((gg)+)\1’ liste2
Rückwärtsverweise
58/62
3.27 Beispiel für Rückwärtsverweise
0. 1. 2. 3. 4. 5. 6. 7. 8.
huo hugo huggo hugggo huggggo hugggggo huggggggo hugggggggo huggggggggo
> egrep ’((gg)+)\1’ liste2 4. 5. 6. 7. 8.
huggggo hugggggo huggggggo hugggggggo huggggggggo Rückwärtsverweise
58/62
3.27 Beispiel für Rückwärtsverweise
0. 1. 2. 3. 4. 5. 6. 7. 8.
huo hugo huggo hugggo huggggo hugggggo huggggggo hugggggggo huggggggggo
> egrep ’u((gg)+)\1o’ liste2
Rückwärtsverweise
59/62
3.27 Beispiel für Rückwärtsverweise
0. 1. 2. 3. 4. 5. 6. 7. 8.
huo hugo huggo hugggo huggggo hugggggo huggggggo hugggggggo huggggggggo
> egrep ’u((gg)+)\1o’ liste2 4. huggggo 8. huggggggggo
Rückwärtsverweise
59/62
3.28 Beispiel für Rückwärtsverweise I
R = (.*).*(/1) und w = abcxabca
I
Aufgrund der ersten Regel ist klar, dass der Match auf jeden Fall mit dem ersten Symbol des Wortes beginnt.
I
Aber dann?
Rückwärtsverweise
60/62
3.28 Beispiel für Rückwärtsverweise I
R = (.*).*(/1) und w = abcxabca
I
Aufgrund der ersten Regel ist klar, dass der Match auf jeden Fall mit dem ersten Symbol des Wortes beginnt.
I
Aber dann? Unter anderem folgende Möglichkeiten:
I
I
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 I
R = (.*).*(/1) und w = abcxabca
I
Aufgrund der ersten Regel ist klar, dass der Match auf jeden Fall mit dem ersten Symbol des Wortes beginnt.
I
Aber dann? Unter anderem folgende Möglichkeiten:
I
I
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 I
R = (.*).*(/1) und w = abcxabca
I
Aufgrund der ersten Regel ist klar, dass der Match auf jeden Fall mit dem ersten Symbol des Wortes beginnt.
I
Aber dann? Unter anderem folgende Möglichkeiten:
I
I
I
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 I
R = (.*).*(/1) und w = abcxabca
I
Aufgrund der ersten Regel ist klar, dass der Match auf jeden Fall mit dem ersten Symbol des Wortes beginnt.
I
Aber dann? Unter anderem folgende Möglichkeiten:
I
I
I
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 I
Symbole / O, (, ), | und * haben eine besondere Bedeutung
I
Außerhalb von Zeichenklassen außerdem zumindest ., +, ?, [, ], { und }
I
sogenannte Metazeichen
I
Problem: Verwendung als Literal?
I
Regel: Um Metazeichen auch als Literale „benutzbar“ zu machen, muss ihnen ein Backslash / vorangestellt werden.
Verwendung von Metazeichen als reguläre Zeichen
62/62