© Liashko/Shutterstock.com
Mit regulären Ausdrücken suchen und finden

Mit regulären Ausdrücken suchen und finden


Für reguläre Ausdrücke gibt es jede Menge Einsatzgebiete; bei der alltäglichen Programmierarbeit sind sie quasi unverzichtbar. Besonders hilfreich sind RegEx als Regelwerk zum Prüfen einer Syntax oder eines Formats. Dieser Bericht zeigt Einsatz und Beispiele aus den Gebieten Web, DB und Objektstrukturen. Denn wer sucht, will gefunden werden.

Doch damit nicht genug: Man kann mit regulären Ausdrücken die Eigenschaften, z. B. das Vorkommen bestimmter (Arten von) Zeichen, Reihenfolge, Häufigkeit etc. eines Texts oder einer Datenmenge allgemein beschreiben und danach suchen oder ersetzen lassen. Dazu sollten wir uns zunächst einmal das Regelwerk ansehen.

Ein Regelwerk

Reguläre Ausdrücke (regular expressions) sind sehr leistungsfähig und ermöglichen das komplizierte und herausfordernde Zerlegen (Parsing) von Texten. Durch einen Quasi-Standard sind auch die Muster hochgradig wiederverwendbar. In dem Sinne gibt es keine irregulären Ausdrücke.

Was sind RegEx? Sie dienen dazu, Muster als Suchmasken oder Filter zu definieren; Muster, oder neudeutsch Patterns, die Klassen von Zeichenketten beschreiben und festlegen.

RegEx-Methoden haben in den meisten Umgebungen das vordefinierte Objekt namens Regex. Sie können Regex schreiben, gefolgt von einem Punkt, um die verfügbaren Methoden zu sehen. Zum Beispiel: RegEx.Options:= [preCaseLess, preMultiline];

Alle Methoden akzeptieren einen Muster-String (pattern string) – das Muster des regulären Ausdrucks. Beachten Sie, dass die kompilierten Muster intern zwischengespeichert werden. Es gibt also keinen Performanceverlust bei mehrfacher Verwendung des gleichen Musters.

Betrachten wir mal einen ersten kleinen RegEx, der seinen Nutzen auch in Suchmasken oder Editoren hat (Abb. 1). In der Regel kennt man Ausdrücke wie *.txt z. B. vom Dateimanagement, somit ist das Prinzip der regulären Ausdrücke bereits bekannt. Einzelne Sonderzeichen (wie hier der Asterisk, *) haben eine spezielle Bedeutung und stehen z. B. für beliebigen Text. Im obigen Beispiel steht der „*“ als Platzhalter für einen beliebigen Dateinamen. Es geht nun um das Suchen oder Ersetzen von leeren Zeilen, sozusagen das „Hello World“ bei RegEx: „^$“.

Bereits bei diesen ersten zwei Zeichen (auch Anchors genannt) kommt der Kontext ins Spiel, der mit Tabelle 1 einhergeht.

RegEx-Zeichen

Funktionalität

^ , \A

Beginn des Strings

$ , \Z

String-Ende

[]

Auswahlmöglichkeiten einzelner Zeichen/ODER

[^]

Negative Auswahlmöglichkeiten einzelner Zeichen/NICHT ODER

.

Beliebiges Zeichen

?

Kein- oder einmal, {0,1}

*

Keinmal bis beliebig oft {0,} (gierig, greedy)

+

Ein- oder mehrmals {1,} (gierig)

*?

Keinmal bis beliebig oft {0,}? (nicht gierig)

+?

Ein- oder mehrmals {1,}? (nicht gierig)

{7}

Siebenmal

{3,5}

Drei- bis fünfmal

{4,}

Viermal oder mehr (mindestens)

Tabelle 1: RegEx-Kontext

Das „^“ steht für Zeilenumbruch oder Vergleich am Anfang einer Zeile aber auch als Negation. Beispielsweise: „^b“ bedeutet alle Zeichen außer „b“ – also eine Negativauswahl.

Das „$“ wiederum meint Zeilenumbruch oder Vergleich am Ende einer Zeile. Falls die Multiline-Option aktiv ist, wird zusätzlich jeder Zeilenanfang und jedes Zeilenende gefunden.

Falls dieser Mehrzeilenmodus gewählt ist, findet „^“ jeden Beginn einer neuen Zeile und „$“ jedes Zeilenende sowie die Position vor dem Ende der Zeichenfolge bzw. vor dem letzten „\n“ (neue Zeile). Falls die Option fehlt, finden die beiden Ausdrücke nur den absoluten Beginn bzw. das Ende der Eingabezeichenfolge. Ein kleines Beispiel inklusive Optionen gefällig?

RegEx.Options:= [preCaseLess, preMultiline]; regex:= '^No.*0$'; Firstmatch: northwest NW Charles Main 30000.00 NextMatch: Northeast NE AM Main Jr. 57800.10

Es wird also jede ganze Zeile (.*) gefunden, die mit „no“ beginnt und mit „0“ endet, zusätzlich wird die Groß- und Kleinschreibung nicht unterschieden. Trainieren wir gleich weiter.

Ausgehend von unserem Anfangszeichen wollen wir uns als Nächstes ansehen, wie wir alle Zeilen ausgeben lassen, die mit einem Großbuchstaben beginnen:

Regex:= '^[A-Z]'; Firstmatch: Western WE Sharon Gray 53000.89 NextMatch: Southern SO Suan Chin 54500.10 NextMatch: Northeast NE AM Main Jr. 57800.10

Neu hinzugekommen ist die Auswahlmöglichkeit „[]“ mit ODER-Logik (Tabelle 1). Aber aufgepasst, dies war eine Falle! Denn solange die Option „[preCaseLess]“ eingestellt ist, wird jede Zeile mit einem simplen Buchstaben...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang