Teil 06: Punkt, Quantoren
Im Falle von EREs haben wir nun alle Moeglichkeiten kennengelernt mit denen man literale Zeichen matchen kann ... mit einer Ausnahmen, die nun folgt:
Punkt
Eigentlich haette das Metazeichen Punkt thematisch besser zu den Zeichenklassen gepasst, da er nichts anderem entspricht als einer Zeichenklasse, die alle Zeichen enthaelt. Oder anders gesprochen: der Punkt matcht ein beliebiges Zeichen.
Statt dieser Zeichenklasse (die alle Zeichen enthaelt):
Code: Alles auswählen
[[:print:][:cntrl:]]
Code: Alles auswählen
.
Der vorige Teil mit den Zeichenklassen war allerdings schon sehr lang und der Punkt passt von den Anwendungsszenarien auch gut zu den hier nun vorgestellten Quantoren, da man ihn dort am oeftesten antrifft.
Aber rekapitulieren wir erst einmal kurz:
- Wir koennen literale Zeichen direkt matchen und sie ggf. escapen, falls es Metazeichen sind.
- Wir koennen mit Zeichenklassen eines von mehreren Zeichen bzw. nun mit dem Punkt ein beliebiges Zeichen matchen. Der Punkt und die vordefinierten Zeichenklassenbereiche erlauben es uns auch und unbekannte Zeichen zu matchen.
- Wir koennen Alternationen nutzen, um eine von mehreren REs zu matchen. Mittels Klammern geht das auch fuer Teil-REs.
Was wir noch nicht koennen ist eine Variabilitaet in der *Laenge* des gematchten Textes. Bislang koennen wir anhand der RE schon im Voraus sagen wie viele Zeichen die Matches umfassen werden. Durch Alternationen koennen das verschiedene Laengen sein, aber wir kennen sie alle.
Wollen wir aber beispielsweise ``beliebig viel Whitespace'' matchen, dann ist uns das bislang noch nicht moeglich. Diese Moeglichkeit lernen wir nun kennen.
Quantoren
Mit Quantoren kann man angeben wie oft die davor stehende Teil-RE wiederholt vorkommen darf bzw. muss. Es gibt vier Arten von Quantoren in EREs. Sie alle beziehen sich auf die direkt davor stehende RE-Komponente, das kann ein literales Zeichen sein oder eine Zeichenklasse oder ein geklammerter Unterausdruck. Sie beziehen sich also auf die kleinstmoegliche Sinneinheit, die vor ihnen steht. Kurzum kann man sagen: Ein Quantor bezieht sich auf das Konstrukt unmittelbar davor das fuer ein einzelnes Zeichen steht (d.h. literales Zeichen, escaptes Zeichen, Zeichenklasse). Nur im Falle eines Unterausdrucks bezieht er sich auf mehrere Zeichen.
Stern
Der Stern ist der einzige Quantor, der bei allen RE-Varianten verfuegbar ist. Er ist stets ein Metazeichen und wird von allen Implementierungen unterstuetzt.
Ein Stern bedeutet, dass die davorstehende Sinneinheit beliebig oft (null bis unendlich) wiederholt werden kann.
Die RE:
Code: Alles auswählen
Aa*h!
Code: Alles auswählen
Ah!
Aah!
Aaah!
Aaaah!
Aaaaah!
Aaaaaah!
Aaaaaaah!
Aaaaaaaah!
Aaaaaaaaah!
usw.
Plus
Oft passender aber nicht in allen RE-Implementierungen verfuegbar (oder es muss escapet werden) ist das Plus. Dieses aehnelt dem Stern, steht aber fuer mindestens ein Vorkommen bis unendlich viele.
Die RE:
Code: Alles auswählen
A[ua]+!
Code: Alles auswählen
Au!
Aa!
Auu!
Aua!
Aau!
Aaa!
Aaua!
Auau!
Auuu!
Aaaa!
Aaau!
Aauuauauuauauuauauuauuuuauuuauaaaauuuuuu!
usw.
Code: Alles auswählen
A!
Fragezeichen
Auch das Fragezeichen ist nicht in allen RE-Implementierungen verfuegbar (oder muss escapet werden). Es steht fuer eine ``Wiederholung'' von null- oder einmal und damit eigentlich nicht fuer eine Wiederholung sondern macht die vorhergehende Teil-RE optional.
So koennen mit folgender RE:
Code: Alles auswählen
colou?r
Code: Alles auswählen
colour
color
Code: Alles auswählen
colo(u|)r
Intervalle
Zuletzt die allgemeinste Form eines Quantors, der alle drei obigen Quantoren ersetzen kann. Intervalle werden mit geschweiften Klammern notiert. (Von wenigen Ausnahmen abgesehen sind Intervalle ueberall verfuegbar. Mit ihnen kann man also auch Plus und Fragezeichen ersetzen, falls es diese in einer RE-Variante nicht gibt. Die geschweiften Klammern muessen in manchen RE-Varianten escapet werden.)
Die geschweiften Klammern koennen:
1) ... genau eine Zahl enthalten. Das bedeutet, dass der davorstehende Teil-Ausdruck genau so oft wiederholt werden muss. Diese Form ist nur Syntactic Sugar, der Schreibarbeit spart, denn den Ausdruck:
Code: Alles auswählen
[0-9]{3}
Code: Alles auswählen
[0-9][0-9][0-9]
Code: Alles auswählen
Na(, na na){4}, hey, Jude
Code: Alles auswählen
(Na(, na na){4}, Hey, Jude){8,24}
Wenn die Band also so richtig im Flow und das Publikum gut ist, dann geht auch mit offenem Ende:
Code: Alles auswählen
(Na(, na na){4}, Hey, Jude){8,}
Gierigkeit
Bei Quantoren (aber auch bei der Alternation) hat die RE-Engine manchmal die Wahl, mehr oder weniger zu matchen. Es ist festgelegt, dass REs immer so viel wie moeglich matchen. POSIX nennt das den fruehesten laengsten Treffer (``the longest of the leftmost matches'').
Die RE:
Code: Alles auswählen
a*
Aufgaben:
1) Matche mit einer RE allen Input.
2) Extrahiere mit `egrep -o' alle Zahlen aus einem Text.
3) Matche in einem XML-Input mit einer RE (ohne Alternation) die Beginn- und Ende-Tags `<h1>' und `</h1>'.
4) Schreibe die entsprechenden Intervallausdruecke fuer die drei anderen Quantoren: * + ?
5) Erklaere die RE: `**'. Auf was wird sie matchen?
6) ``Bananen?'' -- Dies ist keine Frage, sondern?
7) Matche alles bis ``ENDE'' (inklusive).
Matche den Inhalt eines Single-Quoted Strings (dieser kann das Single-Quote nicht enthalten).
9) Matche einen Satz, d.h. von einem Grossbuchstaben bis zum naechsten Satzendezeichen. (Zweimal drueber nachdenken und testen. Der erste Ansatz ist nicht unbedingt ausreichend!)
10) Matche grosse Geldwerte mit Tausendertrenner.
11) Finde ein sinnhaftes Praxisbeispiel fuer eine RE mit Punkt aber ohne Quantoren.