CROSSCAP Handbuch
Reguläre Ausdrücke
Bedienungsanleitung CROSSCAP > Wissenswertes > Reguläre Ausdrücke

Reguläre Ausdrücke stellen ein mächtiges Werkzeug zur Separation und Filterung von Daten dar. Das Thema ist allerdings sehr komplex und anfänglich recht lernintensiv.

In regulären Ausdrücken können Sie im Gegensatz zu buchstabengetreuen Zeichenfolgen bestimmte Textmuster angeben. Dazu verwenden Sie literale Zeichen und Metazeichen.

Literale Zeichen sind alle Zeichen, die in einem regulären Ausdruck keine besondere Bedeutung haben und nach denen gesucht wird, auch Suchgerüst genannt. Buchstaben und Ziffern sind beispielsweise literale Zeichen.

Ein Metazeichen hingegen ist ein Symbol in einem regulären Ausdruck mit einer besonderen Bedeutung (Begrenzungszeichen, Operator oder Platzhalter).

Reguläre Ausdrücke sind letztlich Suchmuster, die sich auf Strings anwenden lassen und für die entscheidbar ist, ob sie auf den String passen (match) oder nicht passen (mismatch). So passt das Suchmuster ei auf den String weise, weil darin die Zeichenfolge ei enthalten ist, aber nicht auf den String tief.

Wendet man ein Suchmuster auf eine Menge von Strings an, dann bekommt man zwei Teilmengen, nämlich die Menge aller Strings, auf die das Muster passt, und die Menge aller Strings, auf die das Muster nicht passt. Meistens interessiert man sich für eine der beiden Teilmengen.

Die verwendeten Zeichen sind Ihnen sicher bekannt, wenn Sie bereits einige Zeit mit dem Computer als Arbeitsmittel vertraut sind. Im Folgenden erfahren Sie, welche Zeichen Verwendung finden und welche Bedeutung oder Funktion ihnen zukommt.

Sie können die Sonderzeichen in regulären Ausdrücken auch kombinieren. Mit einer Kombination aus Platzhalter- Punkt und Wiederholungszeichen Stern also

.*

suchen Sie beispielsweise nach einer beliebigen Zeichenfolge. Dieser Ausdruck wird meist als Teil eines größeren Ausdrucks verwendet, wie z. B. in

b.*ung

Dieser Ausdruck sucht nach allen Zeichenfolgen, die mit B beginnen und mit ung enden.

Reguläre Ausdrücke werden meistens durch einen endlichen Automaten realisiert. Die Informatik kennt Verfahren, mit denen man automatisch einen Automaten generieren kann, der für ein bestimmtes Suchmuster entscheidet, ob es auf einen String passt oder nicht. Auch die regulären Ausdrücke funktionieren so.

Bei der ersten Benutzung eines regulären Ausdruckes wird ein solcher Automat intern generiert (das Muster wird „compiliert“) und dann angewendet. Bei späteren Benutzungen desselben Suchmusters kann dieser Automat dann unter Umständen wieder verwendet werden, was deutlich schneller ist.

Einige Suchmuster und Bedingungen sind zu komplex, als dass man sie mit Hilfe von regulären Ausdrücken und Automaten formulieren könnte.

Typische Beispiele dafür sind Dinge, die Abzählungen erforderlich machen:


Auch Dinge, die Vorbedingungen notwendig machen:

In diesen Fällen braucht man leistungsfähigere Konzepte und Werkzeuge, kontextfreie oder kontextsensitive Grammatiken und dazu passende Parser. In CROSSCAP ist der Aufbau komplexer Bedingungen durch die Hintereinanderschaltung mehrerer Filter möglich.

In der Praxis verwendet man reguläre Ausdrücke, um zu entscheiden, ob ein String bestimmten formalen Kriterien genügt:

oder um bestimmte Teilstücke aus Strings herauszuschneiden:

 

Bauelemente in regulären Ausdrücken


Übersicht

Zeichen

Name

Bedeutung

\ Backslash Escape-Zeichen

^

Caret- oder Dachzeichen

Position in Zeile: Zeilenanfang

$

Dollar- oder Stringzeichen

Position in Zeile: Zeilenende

.

Punkt

Platzhalter: beliebiges Zeichen

|

Pipelinezeichen

Verzweigung/Alternative

{ }

Geschweifte Klammer

Quantifizierer

?

Fragezeichen

Steht für null oder eine Wiederholung des vorhergehenden Ausdrucks.

*

Stern

Wiederholung: kein bzw. wiederholtes Auftreten des vorhergehenden Zeichens bzw. der vorhergehenden Zeichenklasse

+

Pluszeichen

Mindestens eine Wiederholung des vorhergehenden Ausdrucks.

[ ]

Eckige Klammer

Einleitung Zeichenmenge

-

Minuszeichen

Bereichsmarkierer

[x-y]

Funktion

Bereich: alle Zeichen im angegebenen Bereich

\x

Funktion

Escape: literale Verwendung des Metazeichens x

\<xyz

Funktion

Position im Wort: Wortanfang

xyz\>

Funktion

Position im Wort: Wortende

[Klasse]

Funktion

Zeichenklasse: ein beliebiges Zeichen der Klasse

[^Klasse]

Funktion Inverse Klasse: alle Zeichen, die nicht in der Klasse angegeben wurden


Suchmuster in regulären Ausdrücken bestehen aus gewöhnlichen Zeichen und Zeichen mit einer Sonderbedeutung. Gewöhnliche Zeichen in Suchausdrücken stehen für die entsprechenden Zeichen in einem String.

Zeichen mit Sonderbedeutung stehen als Platzhalter für ein oder mehrere andere Zeichen, für Zeilenanfänge oder -enden oder für andere Sonderfunktionen. Sie sind es, die reguläre Ausdrücke eigentlich mächtig und sinnvoll machen.

In regulären Ausdrücken gibt es Zeichenmengen, die durch die eckigen Klammern [ und ]eingeschlossen werden. Bei Zeichen mit Sonderbedeutung gelten leicht unterschiedliche Regeln, je nachdem, ob man gerade außerhalb einer Zeichenmenge arbeitet oder innerhalb. Außerhalb von Zeichenmengen gibt es die folgenden besonderen Regeln:


Der Backslash

\

   

wird als Escape-Zeichen verwendet, mit unterschiedlichen Anwendungen. Für Sonderzeichen (also alle nicht alphanumerischen Zeichen) nimmt es den Zeichen ihre besondere Bedeutung, so dass man sie wörtlich in das Suchmuster einfügen kann.

Das Suchmuster

\*

passt also auf genau ein Sternchen.

Für alphabetische Zeichen hat es eine besondere Bedeutung ähnlich wie in der Programmiersprache C.

\r

steht für ein Return (ASCII 13),


\n

steht für ein Linefeed (ASCII 10) und so weiter.

Die Zeichenfolgen \d, \D, \w, \W, \s und \S beschreiben bestimmte vordefinierte Zeichenmengen (siehe unten).

In Zeichenfolge \0xYY definiert es das Zeichen mit dem hexadezimalen Zeichencode YY.

Ein

\0x0A

steht also für ein Zeichen mit einem Zeichencode ASCII 10 (Linefeed).


In Zeichenfolgen

\XXX

definiert es das Zeichen mit dem oktalen Zeichencode XXX.

Ein

\012

steht also für ein Zeichen mit dem Zeichencode ASCII 10 (Linefeed).

Diese Schreibweise wird jedoch nicht empfohlen, weil sie sich mit einer anderen Schreibweise für so genannte Backreferences (siehe unten) überlappt.


Caret- oder Dachzeichen

^

steht als Markierung für einen Stringanfang.

Das Suchmuster ^hallo passt auf alle Strings, die mit dem Wort hallo... beginnen, jedoch nicht auf Strings, die ...hallo... irgendwo in der Mitte enthalten.


Stringzeichen

$

Entsprechend steht das Stringzeichen $ für ein Stringende.

Welt!$

passt auf Zeichenketten, die mit dem Text Welt! enden.

^$

passt auf Strings, die nur aus einem Beginn und einem Ende bestehen, also auf Leerstrings.


Punkt

.

Der Punkt passt auf genau ein beliebiges Zeichen, außer auf das Zeilenendezeichen (\n).

Das Suchmuster

...

passt also auf alle Strings, die aus genau drei Zeichen bestehen.


Pipelinezeichen

|

Das Pipelinezeichen | kennzeichnet einen Zweig einer Alternative.

So passt das Suchmuster (Sie|Du) auf entweder die Zeichenfolge sie oder du.

Die runden Klammern () schließen ein Untermuster bzw. Teilmuster ein. Man kann dies verwenden, um einen Teilbereich eines Suchmusters zum Zwecke der späteren Verwendung zu markieren oder um Teilmuster zu gruppieren.

Für die Gruppierung findet man im vorhergehenden Punkt schon ein Beispiel:

Markierte Teilbereiche eines Suchmusters, so genannte Backreferences, lassen sich später nach der Anwendung des Musters extrahieren und weiterverarbeiten.

Das Muster

„(.)“

passt auf genau ein beliebiges Zeichen, das zwischen Anführungszeichen steht. Welcher Buchstabe aus dem getesteten String genau gepasst hat, kann man nach der Anwendung des Suchmusters erfragen. Dies verwendet man oft, um Teilstrings mit einem bestimmten Aussehen aus einem größeren String herauszuschneiden. Innerhalb eines regulären Ausdrucks werden die öffnenden runden Klammern von links nach rechts durchnummeriert. Innerhalb desselben Ausdrucks kann man sich mit Backreferences auf den Text beziehen, der von einer Klammer markiert worden ist:

\1

bezeichnet den Text, der von der ersten öffnenden Klammer umschlossen wird,

\2

den Text in der zweiten Klammer und so weiter. Dazu in einem der folgenden Punkte mehr.

Quantifizierer

{}

Mit Hilfe von Quantifizierern in geschweiften Klammern kann man festlegen, wie viele Wiederholungen des vorhergehenden Ausdrucks gesucht werden.

Fragezeichen

?

Das Fragezeichen kann als Kürzel für

{0,1}

verwendet werden. Es steht für null oder eine Wiederholung des vorhergehenden Ausdrucks.

Stern

*

Der Stern steht für

{0,}

also für null oder mehr Wiederholungen des vorhergehenden Ausdrucks.

Pluszeichen

+

Das Pluszeichen steht für

{1,}

, also für mindestens eine Wiederholung des vorhergehenden Ausdrucks.


Eckige Klammern

[ ]

Eckige Klammern leiten eine Zeichenmenge ein. Eine Zeichenmenge steht immer für genau ein Zeichen, und zwar für ein Zeichen, das in der Menge enthalten ist. Also passt der reguläre Ausdruck

[0123456789]

auf genau eine beliebige Ziffer.

Innerhalb der eckigen Klammern einer Zeichenmenge haben die folgenden Zeichen eine besondere Bedeutung:

[^0123456789]

steht also für genau ein Zeichen, das keine Ziffer ist.

Minuszeichen

-

Das Minuszeichen - definiert einen Bereich. Die Zeichenmenge

[0-9]

ist also eine kürzere Schreibweise als

[0123456789]

für dieselbe Menge.

Besondere Zeichenmengen

Verwendet man einen Suchausdruck mit den preg*-Funktionen, dann ist der Suchausdruck in so genannte Begrenzerzeichen (Delimiter) einzuschließen, hinter denen noch Optionen mit angegeben werden können. Meistens verwendet man entweder die Schrägstriche / oder Gleichheitszeichen =.

Aus diesen Komponenten lassen sich mit einiger Übung Suchausdrücke zusammenbauen, die schnell und sicher die gewünschten Suchfunktionen oder Suche-und-ersetze-Funktionen durchführen.

Beispiele häufig verwendeter Ausdrücke

Ausdruck Bedeutung
\d eine dezimale Ziffer
\D die Negation von \d
\w ein „Wort“-Zeichen
\W die Negation von \w
\s ein „Whitespace“-Zeichen
\S die Negation von \s
{n,m} n bis m Wiederholungen des vorhergehenden Ausdrucks
{n,} mindestens n Wiederholungen
{,m} maximal m Wiederholungen
{n} bezeichnet genau n Wiederholungen
a{3,5} alle Strings, die zwischen 3 und 5 Zeichen a in Folge enthalten
(bla){3} alle Strings, die genau die Zeichenfolge blablabla enthalten
^a(.{3,})b$ alle Strings, die mit einem a anfangen, mit einem b enden und die dazwischen mindestens 3 Zeichen enthalten. Welche (und wie viele) Zeichen dies waren, kann man nach Anwendung des Musters abfragen, da dieser Bereich im Muster mit runden Klammern markiert war.