Suchen mit regulären Ausdrücken
Kommentare

Die Hauptanwendung für reguläre Ausdrücke ist unbestritten das Suchen nach Mustern. Dieses Kapitel zeigt alle relevanten Aspekte in Hinblick auf Muster. Bevor wir in die Theorie einsteigen, noch ein wenig Hintergrund, wie die Mustersuche funktioniert. Es gibt zwei Grundprinzipien, nach denen ein regulärer Ausdruck vorgeht:

  1. Die Suche wird von links nach rechts durchgeführt. Der erste Treffer wird zurückgeliefert, also der Treffer, der am weitesten links steht.
  2. Die Suche wird gierig (englisch: greedy) durchgeführt: Das Muster passt auf möglichst viele Zeichen. Lautet also ein Muster „beliebig viele Ziffern hintereinander“ und die zu durchsuchende Zeichenkette besteht ausschließlich aus Ziffern, so ist das Suchergebnis der komplette String, auch wenn bereits eines der Zeichen im String auf das Muster passen würde.

Die Reihenfolge dieser Regeln ist dabei wie gezeigt. Angenommen, ein Muster besagt „beliebig viele Ziffern hintereinander“ und der folgende String wird durchsucht: 1234X56789. Der „hintere“ Treffer auf das Muster, 56789, ist länger als der „vordere“ Treffer, 1234. Doch die erste Regel („von links nach rechts“) hat eine höhere Priorität als die zweite Regel; deswegen findet das Muster den Treffer 1234. Ein Begrenzungszeichen ist notwendig, um den Anfang und das Ende des regulären Ausdrucks zu markieren. Was Sie dabei wählen, ist relativ egal, solange es kein Backslash und kein alphanumerisches Zeichen ist. Meist setzt man auf den Schrägstrich (/), doch auch andere Zeichen sind möglich (häufig gesehen: etwa # oder %). Hintergrund: Wenn das Zeichen, das als Trennzeichen zum Einsatz kommt, innerhalb des regulären Ausdrucks ebenfalls vorkommt, muss es dort (durch einen vorangestellten Backslash) maskiert werden. Manche Implementierungen erfordern jedoch bestimmte Trennzeichen.

Literale

Ein Muster an sich ist bereits Folgendes:

/sechs/

Dieses Muster passt nicht nur auf die Zahl sechs oder auf komplexere Sätze wie Ein halbes Dutzend Eier sind sechs Eier, sondern auch auf Wörter wie Hausechse, denn auch dort kommt sechs vor. Man spricht hier ebenfalls von einem Literal.

Standardmäßig wird zwischen Groß- und Kleinschreibung unterschieden; obiges Muster würde also nicht auf den Satz Sechs Eier sind ein halbes Dutzend passen.

Hinweis: Alle regulären Ausdrücke in diesem Buch verwenden die Begrenzungszeichen links und rechts. Je nachdem, welche Implementierung von regulären Ausdrücken sie verwenden, ist das unter Umständen nicht notwendig. Der Vollständigkeit halber und um auf häufige Fehlerquellen bei der Verwendung von Begrenzern hinzuweisen, verzichten wir nicht auf den Schrägstrich (oder ein äquivalentes Zeichen) am Anfang und am Ende jedes Ausdrucks. RegexBuddy übrigens benötigt die Begrenzer nicht bzw. sieht sie selbst als Literale an.

Zeichen maskieren

Solche Literal-Muster können alle Zeichen enthalten, inklusive Leer- und Sonderzeichen. Allerdings besitzen einige Zeichen innerhalb von regulären Ausdrücken eine besondere Bedeutung, unter anderem die folgenden:

(
)
?
*
+
^
$
.
|
[


Diese Zeichen werden auch Metazeichen genannt. Aufgrund ihrer speziellen Bedeutung innerhalb eines regulären Ausdrucks müssen sie speziell maskiert werden. Wenn Sie also in einem Ausdruck nach einer Klammer suchen, muss die Klammer maskiert werden – andernfalls würde die spezielle Bedeutung der Klammer zum Einsatz kommen.

Hinweis: Die Begrenzungszeichen des regulären Ausdrucks, bei den meisten Beispielen in diesem Buch der Schrägstrich (/), müssen ebenfalls maskiert werden.

Das Zeichen zum Entwerten ist der Backslash (). Dieser entwertet das nachfolgende Zeichen (auch, wenn das wiederum ein Backslash sein sollte). Wenn Sie also aus irgendeinem Grund nach der Zeichenkette ([/.*]) suchen möchten, sieht der reguläre Ausdruck dafür wie folgt aus:

/([/.*\])/

Das einzige Zeichen, das nicht maskiert worden ist, ist die schließende eckige Klammer, da ist das nicht notwendig. Schaden beziehungsweise etwas bewirken würde eine Maskierung allerdings nicht.

Profitipp: Wenn Sie reguläre Ausdrücke in einer Programmiersprache verwenden, beachten Sie, dass sie innerhalb von Strings ebenfalls einige Zeichen (vor allem den Backslash) entwerten müssen. In PHP beispielsweise sieht ein String, der den obigen regulären Ausdruck enthält (mehr Details dazu finden Sie in Kapitel 5), wie folgt aus – die neu hinzugefügten Backslashes sind halbfett hervorgehoben:
$regex = '/\(\[\/\.\*\\]\)/';

Der Backslash maskiert nicht nur Sonderzeichen, sondern stellt in Verbindung mit bestimmten Zeichen spezielle Ausdrücke dar, so genannte nicht druckbare Zeichen. Dazu gehören beispielsweise der Tabulator, der Wagenrücklauf und der Zeilenvorschub. Hier eine Liste:

  • a – Piepston
  • e – Escape-Zeichen
  • f – Formfeed (Seitendurchlauf)
  • n – Newline (Zeilenvorschub)
  • r – Carriage Return (Wagenrücklauf)
  • t – horizontaler Tabulator
  • v – vertikaler Tabulator

Von diesen Zeichen sind vor allem der Zeilenvorschub und der Wagenrücklauf wichtig, denn diese beenden eine Zeile (unter Unix/Linux ist nur n notwendig, Windows verwendet rn). Auch der Tabulator ist praktisch, denn damit lassen sich recht bequem Serverlogs auslesen – der Tabulator trennt die einzelnen Einträge in jeder Zeile voneinander. Letzte Anwendung für Backslashes: Sonderzeichen aus den Zeichensätzen Latin-1 und Unicode lassen sich so angeben. Das macht reguläre Ausdrücke leichter portierbar. Das Zeichen für das britische Pfund, £, hat in Latin-1 den Zeichencode 163. In Hexadezimalschreibweise wird aus 163 die Zahl A3. Ein regulärer Ausdruck, der auf das Pfund-Zeichen passt, sieht dann wie folgt aus:

/xA3/

Durch das Präfix x wird also ein Zeichencode in Latin-1 dargestellt. Soweit zum britischen Pfund; das Euro-Zeichen dagegen ist nicht Teil von Latin-1, denn der Zeichensatz ist älter, zugunsten des Euro-Symbols konnte kein anderes Zeichen herausgeworfen werden. Im Unicode-Zeichensatz war natürlich noch Platz. Die hexadezimale Zeichennummer lautet 20AC, das Präfix für Unicode-Zeichen ist u. Damit ergibt sich das folgende Muster für €:

/u20AC/
Lesen Sie mehr über Suchgrenzen, Zeichenklassen,Alternativen und Quantifizierer im kompletten Probekapitel


Aufmacherbild: Shiny glossy icon with white design on black background von Shutterstock / Urheberrecht: ValentinT

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -