Wir beginnen mit einigen Metazeichen vonegrep, um die Möglichkeiten dieses Werkzeugs auszuloten. Ich werde diese nur kurz mit ein paar Beispielen behandeln; die erschöpfende Beschreibung folgt in späteren Kapiteln.
Typografische Konventionen
Vor Beginn stellen Sie bitte sicher, dass Sie die hier verwendeten typografischen Konventionen kennen („Typografische Konventionen“).
Wahrscheinlich am einfachsten zu verstehen sind die Metazeichen^ (Zirkumflex) und$ (Dollar), die für den Anfang bzw. das Ende der zu prüfenden Zeile stehen. Wie wir gesehen haben, findet der reguläre Ausdrückding die Zeichend?i?n?g irgendwo auf der Zeile, aber^ding findet die Zeichend?i?n?g nur dann, wenn sie am Anfang der Zeile stehen. Analog passt der reguläre Ausdrückding$ nur am Ende der Zeile, wenn zum Beispiel eine Zeile mitUnding endet. Weil Zirkumflex und Dollar den regulären Ausdrück am Anfang oder am Ende der Zeile festmachen, nennt man sieZeilenanker oder einfachAnker.
^
$
ding
d
i
n
g
^ding
ding$
Unding
Machen Sie es sich zur Gewohnheit, reguläre Ausdrücke in einem wörtlichen Sinn zu interpretieren. Lesen Sie nicht:
sondern eher:
Das kommt zwar auf dasselbe heraus, aber die wörtliche Lesart erlaubt es, einen neuen Ausdruck besser zu verstehen. Wie würdeegrep^ding$,^$ oder ganz einfach^ allein interpretieren? Für die Auflösung bitte umblättern.
^ding$
^$
Der Zirkumflex und das Dollarzeichen sind insofern speziell, als sie einePosition in der Zeile beschreiben und nicht ein Zeichen selbst. Es gibt natürlich einige Möglichkeiten, um auf wirkliche Zeichen in der Zeile zu prüfen. Neben Literalen, die für das Zeichen selbst stehen, gibt es einige andere Metazeichen, die in den nächsten Abschnitten behandelt werden.
Nehmen wir an, Sie wollen nach dem String»Birma« suchen, aber auch»Burma«[4] zulassen. Die Konstruktion[...], meistZeichenklasse genannt, ermöglicht es, eine Liste von Zeichen anzugeben, nach denen gesucht werden soll. Eini passt nur auf eini, einu nur auf einu, einiu aber auf beide. Der reguläre AusdruckB[iu]rma bedeutet also wörtlich: Suche nachB, gefolgt von einemi oder einemu, gefolgt vonr, einemm und danach einema. Ich bin ziemlich schlecht in der Rechtschreibung, daher benutze ich oft reguläre Ausdrücke, um Wörter zu finden, die ich immer wieder falsch schreibe. Einer meiner häufigen Fehler istsep[ea]r[ea]te, weil ich mich nie daran erinnern kann, ob das Wort nun»seperate«,»separate«,»separete« oder wie auch immer geschrieben wird.
[...]
u
iu
B[iu]rma
B
r
m
a
sep[ea]r[ea]te
Beachten Sie, dass zwischen den Zeichen außerhalb der Zeichenklasse (hierr,m unda im vollständigen AusdruckB[iu]rma) ein Nacheinander oder ein»und dann« impliziert wird– zunächst einrund dann einmund dann eina. Ganz anders innerhalb der Zeichenklasse: Dort spielt die Reihenfolgeüberhaupt keine Rolle, es geht dort um einoder.
Oder vielleicht wollen Sie die Groß- oder Kleinschreibung eines Wortes zulassen:[Rr]ot. Das passt noch immer auch auf Zeilen, bei denen der Stringrot oderRot als Teil eines Wortes vorkommt, etwa inProtest. Ich reite etwas auf diesem Punkt herum, weil meine Erfahrung zeigt, dass dies bei Neulingen ein Stolperstein ist. Wenn wir ein paar weitere Metazeichen kennen, werde ich erneut darauf zurückkommen.
[Rr]ot
rot
Rot
Protest
Die Liste in den eckigen Klammern kann beliebig viele Zeichen enthalten. Zum Beispiel erkennt[123456] irgendeine der angegebenen Ziffern. Diese Zeichenklasse kann als Teil von<H[123456]> (erkennt<H1>,<H2>,<H3> usw.) nützlich sein, wenn es darum geht, HTML-Tags zu prüfen.
[123456]
<H[123456]>
<H1>
<H2>
<H3>
Innerhalb einer Zeichenklasse gibt dasZeichenklassen-Metazeichen›-‹ (Bindestrich) einen Bereich von Zeichen an:<H[1-6]> bedeutet exakt dasselbe wie das vorherige Beispiel.[0-9] und[a-z] sindübliche Abkürzungen für Ziffern bzw. Kleinbuchstaben. Mehrfache Bereiche sind zugelassen.[0123456789abcdefABCDEF] kann also kürzer so geschrieben werden:[0-9a-fA-F] (oder auch[A-Fa-f0-9], die Reihenfolge der Bereiche spielt keine Rolle). Diese drei Bereiche werden oft gebraucht, wenn man mit hexadezimalen Zahlen arbeitet. Bereiche können auch mit Literalen kombiniert werden:[0-9A-Z_!.?] passt auf Ziffern, Großbuchstaben, den Unterstrich, Ausrufezeichen, Punkt oder Fragezeichen.
<H[1-6]>
[0-9]
[a-z]
[0123456789abcdefABCDEF]
[0-9a-fA-F]
[A-Fa-f0-9]
[0-9A-Z_!.?]
Beachten Sie, dass der Bindestrich nur innerhalb einer Zeichenklasse ein Metazeichen ist– außerhalb dieser ist er ein normaler Bindestrich. Sogar innerhalb einer Zeichenklasse ist er nicht immer ein Metazeichen. Falls der Bindestrich das erste Zeichen innerhalb der Klasse ist, kann er ja schlecht einen Bereich angeben; er wird dann als Literal behandelt. Ganzähnlich sind das Fragezeichen und der Punkt in einem regulären Ausdruck normalerweise Metazeichen, aber nicht innerhalb einer Zeichenklasse! Um das ganz klarzumachen: Nur die zwei Bindestriche in[0-9A-Z_!.?] sind Metazeichen.
Weitere Beispiele dazu folgen in Kürze.
Wenn man[^...] statt[...] benutzt, passt die Klasse auf alle Zeichen, dienicht unter den angegebenen Zeichen sind. Zum Beispiel erkennt[^1-6] alle Zeichenaußer1 bis6. Der Zirkumflex als erstes Zeichen in der Klasse»negiert« also die Liste– statt alle erwünschten Zeichen aufzulisten, gibt man die unerwünschten an.
[^...]
[^1-6]
1
6
Sicher ist Ihnen aufgefallen, dass das Zeichen^ derselbe...