Formale Sprachen und Automaten

Formale Sprachen und Automaten Kapitel 3: Regular Expressions Vorlesung an der DHBW Karlsruhe Thomas Worsch Karlsruher Institut für Technologie, Fak...
Author: Fritzi Schmitt
3 downloads 3 Views 473KB Size
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