WaBis

walter.bislins.ch

regulärer Ausdruck

Reguläre Ausdrücke (Abk. RegExp oder Regex, engl. regular expression) dienen der Beschreibung einer Familie von formalen Sprachen, d.h. sie beschreiben (Unter-)Mengen von Zeichenketten.

Eine umfassende Beschreibung in Englisch findest du unter:

 Introduction to Regular Expressions (Scripting) - Microsoft: VBScript User's Guide

Sehr viele Programme und Bibliotheken von Programmiersprachen implementieren Funktionen, um reguläre Ausdrücke zum Suchen und Ersetzen von Zeichenketten zu nutzen. Beispiele dafür sind die Programme sed, grep, emacs und Bibliotheken der Programmiersprachen C, VBScript, JavaScript, Perl, Java, auch die Textverarbeitung des Office-Paketes OpenOffice bietet die Möglichkeit, mit regulären Ausdrücken im Text zu suchen. Einige Programmiersprachen wie z.B. Perl, VBScript, JavaScript unterstützen einige Erweiterungen der regulären Ausdrücke, z.B. Rückwärtsreferenzen.

Hinweis: Die Umwandlung der Wiki-Syntax in HTML-Code in diesem Wiki geschieht zur Hauptsache durch Suchen und Ersetzen mit regulären Ausdrücken. Dies zeigt, wie mächtig dieses Konzept ist.

Anwendung regulärer Ausdrücke

Reguläre Ausdrücke unterstützen genau drei Operationen:

  1. Alternative
  2. Aneinanderreihung
  3. Wiederholung

Eine häufige Anwendung regulärer Ausdrücke besteht darin, spezielle Zeichenketten in einer Menge von Zeichenketten zu finden. Die im Folgenden angegebene Beschreibung ist eine oft benutzte Konvention, um Konzepte wie Zeichenklasse, Quantifizierung, Verknüpfung und Zusammenfassen konkret zu realisieren. Hierbei wird ein regulärer Ausdruck aus den Zeichen des zugrunde liegenden Alphabets in Kombination mit sogenannten Metazeichen ([ ] ( ) { } ? + * ^ $ \ .) gebildet. Alle übrigen Zeichen des Alphabets stehen für sich selbst.

Zeichenliterale

Diejenigen Zeichen, die direkt (wörtlich, literal) übereinstimmen müssen, werden auch direkt notiert. Je nach System gibt es auch Möglichkeiten, den Oktal- oder Hexadezimalcode anzugeben.

Beliebiges Zeichen

Ein Punkt bedeutet, dass an seinem Platz ein (fast) beliebiges Zeichen stehen kann. In der VBScript-Implementierung und somit in Wiki-Script darf an der Stelle des Punktes kein Newline-Zeichen stehen.

Ein Zeichen aus einer Auswahl

Mit eckigen Klammern lässt sich eine Zeichenauswahl definieren. Der Ausdruck in eckigen Klammern steht dann für genau ein Zeichen aus dieser Auswahl (Einzeichenmuster).

Beispiele:

[egh] eines der Zeichen e, g oder h
[0-6] eine Ziffer von 0 bis 6 (Bindestriche sind Indikator für einen Bereich)
[A-Za-z0-9] ein beliebiger lateinischer Buchstabe oder eine beliebige Ziffer
[^a] ein beliebiges Zeichen ausser a (^ am Anfang einer Zeichenklasse negiert selbige)

Vordefinierte Zeichenklassen

Wichtige Zeichenklassen sind:

\d eine Ziffer [0-9]
\D keine Ziffer [^0-9]
\w ein Buchstabe, eine Ziffer oder der Unterstrich [a-zA-Z_0-9]
\W kein Buchstabe, keine Zahl und kein Unterstrich [^\w]
\s Whitespace, meistens [ \f\n\r\t\v]
\S alle Zeichen außer Whitespace [^\s]

Quantoren

Quantoren (auch Quantifizierer oder Wiederholungsfaktoren) erlauben es, den vorherigen Ausdruck in verschiedener Vielfachheit in der Zeichenkette zuzulassen:

? Der voranstehende Ausdruck ist optional, er kann einmal vorkommen, muss es aber nicht, d. h. der Ausdruck kommt null- oder einmal vor.
+ Der voranstehende Ausdruck muss mindestens einmal vorkommen, darf aber auch mehrfach vorkommen.
* Der voranstehende Ausdruck darf beliebig oft (auch keinmal) vorkommen.
{n} Der voranstehende Ausdruck muss exakt n-mal vorkommen.
{min,} Der voranstehende Ausdruck muss mindestens min-mal vorkommen.
{min,max} Der voranstehende Ausdruck muss mindestens min-mal und darf maximal max-mal vorkommen.

Beispiele:

a+ erlaubt ein "a" oder ein "aa" oder auch "aaaa" etc.
[ab]+ dagegen erlaubt ein "a", "b", "aa", "baab" etc.
[0-9]{2,5} findet "13", "28333", "123", aber nicht "0", "123123223" etc.

Gieriges Verhalten

Normalerweise wird von einem regulären Ausdruck mit Quantor die grösstmögliche passende Zeichenkette gefunden (gematcht, von englisch "to match"), weshalb dieses Verhalten als gierig (engl.: greedy) bezeichnet wird. Da dieses Verhalten jedoch nicht immer so gewollt ist, lassen sich Quantoren als non-greedy (also nicht gierig) deklarieren. Hierfür wird dem Quantor ein Fragezeichen ? nachgestellt.

Beispiel:

Angenommen es wird auf den String "ABCDEB" der reguläre Ausdruck A.*B angewendet, so würde er den kompletten String "ABCDEB" matchen. Mit Hilfe des non-greedy-Quantors "*?" matcht der Ausdruck A.*?B die Zeichenkette "AB", bricht also die Suche nach dem ersten gefundenen "B" ab.

Gruppierung mit runden Klammern

Ausdrücke lassen sich mit runden Klammern ( und ) zusammenfassen: Etwa erlaubt "(abc)+" ein "abc" oder ein "abcabc" etc.

VBScript und somit auch Wiki-Script speichern die Gruppierung ab und ermöglichen deren Wiederverwendung im Regulären Ausdruck oder bei der Textersetzung: Ein Suchen und Ersetzen mit AA(.*?)BB als Regulären Suchausdruck und $1 als Ersetzung ersetzt alle Zeichenketten, die von AA und BB eingeschlossen sind, durch den zwischen AA und BB enthaltenen Text. D.h. AA und BB und das dazwischen wird ersetzt durch das Dazwischen, also fehlen AA und BB im Ergebnis. $1, $2 usw. nennt man Rückwärtsreferenzen (engl. "Backreferences"). $1 bezieht sich auf das erste Klammerpaar, $2 auf das zweite usw.; dabei zählt man die öffnenden Klammern.

Im regulären Ausdruck wird statt $1, $2 usw. \1, \2 usw. verwendet. Der folgende reguläre Ausdruck zum Beispiel stellt fest, ob in einem String vor und nach der 1 die gleiche Anzahl von 0 steht.

(0*)1\1

Alternativen

Man kann alternative Ausdrücke mit dem | Symbol zulassen:

"(ABC|abc)" bedeutet "ABC" oder "abc", aber z.B. nicht "Abc".

Weitere Zeichen

Um die oft auf Zeichenketten bezogenen Anwendungen auf dem Computer zu unterstützen, werden in der Regel zusätzlich zu den bereits genannten die folgenden Zeichen definiert:

^ steht für den Zeilenanfang.
$ kann je nach Kontext für das Zeilen- oder Stringende stehen.
\ hebt ggf. die Metabedeutung des nächsten Zeichens auf, beispielsweise lässt der Ausdruck "(A\*)+" die Zeichenketten "A*", "A*A*" etc. zu.
\b steht für die leere Zeichenkette am Wortanfang oder am Wortende.
\B steht für die leere Zeichenkette, die nicht den Anfang oder das Ende eines Wortes bildet.
Diese Seite basiert auf dem Artikel Regulärer Ausdruck aus der freien Enzyklopädie Wikipedia und steht unter der Lizenz für freie Dokumentation (GNU). In der Wikipedia ist eine Liste der Autoren verfügbar.
Weitere Infos zur Seite
Erzeugt Freitag, 3. März 2006
Zum Seitenanfang
Geändert Dienstag, 17. Januar 2012
von wabis