Reguläre Ausdrücke

Einführung

Reguläre Ausdrücke werden weitum verwendet, um Textmuster zu beschreiben, nach welchen dann gesucht wird. Spezielle Metazeichen erlauben das Definieren von Bedingungen, beispielsweise soll ein bestimmter gesuchter String am Anfang oder am Ende einer Zeile vorkommen, oder ein bestimmtes Zeichen soll n mal vorkommen.

Reguläre Ausdrücke sehen üblicherweise für Anfänger ziemlich kryptisch aus, sind aber im Grunde genommen sehr einfache, handliche und enorm mächtige Werkzeuge.

In den Links am Ende der Dokumentation finden Sie Verweise auf interessante Seiten zu diesem Gebiet im Internet.

Einfache Treffer

Jedes einzelne Zeichen findet sich selbst, außer es sei ein Metazeichen mit einer speziellen Bedeutung (siehe weiter unten).

Eine Sequenz von Zeichen findet genau dieses Sequenz im zu durchsuchenden String (Zielstring). Also findet das Muster (= reguläre Ausdruck) „bluh“ genau die Sequenz „bluh“ irgendwo im Zielstring.

Damit Sie Zeichen, die üblicherweise als Metazeichen oder Escape-Sequenzen dienen, als ganz normale Zeichen ohne jede Bedeutung finden können, stelle so einem Zeichen einen „\“ voran. Diese Technik nennt man Escaping.

Ein Beispiel: das Metazeichen „^“ findet den Anfang des Zielstrings, aber „\^“ findet das Zeichen „^“ (Circumflex), „\\“ findet also „\“ etc.

Beispiele

RegexHinweis
foobar
findet den String „foobar“
\^FooBarPtr
findet den String „^FooBarPtr“

Escape-Sequenzen

Zeichen können auch angeben werden mittels einer Escape-Sequenz, in der Syntax ähnlich derer, die in C oder Perl benutzt wird: „\n“ findet eine neue Zeile, „\t“ einen Tabulator etc. Etwas allgemeiner: \xnn, wobei nn ein String aus hexadezimalen Ziffern ist, findet das Zeichen, dessen ASCII Code gleich nn ist. Falls Sie Unicode-Zeichen (16 Bit breit kodierte Zeichen) angeben möchtest, dann benutze „\x{nnnn}“, wobei „nnnn“ – eine oder mehrere hexadezimale Ziffern sind.

RegexBeschreibung
\xnn
Zeichen mit dem Hex-Code nn (ASCII-Text)
\x{nnnn}
Zeichen mit dem Hex-Code nnnn (ein Byte für ASCII-Text und zwei Bytes für Unicode-Zeichen
\t
ein Tabulator (HT/TAB), gleichbedeutend wie \x09
\n
Zeilenvorschub (NL), gleichbedeutend wie \x0a
\r
Wagenrücklauf (CR), gleichbedeutend wie \x0d
\f 
Seitenvorschub (FF), gleichbedeutend wie \x0c
\a
Alarm (bell) (BEL), gleichbedeutend wie \x07
\e
Escape (ESC), gleichbedeutend wie \x1b

Beispiele

RegexHinweis
foo\x20bar
findet „foo bar“ (beachten Sie das Leerzeichen in der Mitte)
\tfoobar
findet „foobar“, dem unmittelbar ein Tabulator vorangeht

Zeichenklassen

Sie können sogenannte Zeichenklassen definieren, indem Sie eine Liste von Zeichen, eingeschlossen in eckige Klammern [], angeben. So eine Zeichenklasse findet genau eines der aufgelisteten Zeichen im Zielstring.

Falls das erste aufgelistete Zeichen, dass direkt nach dem „[" ein „^“ ist, findet die Zeichenklasse jedes Zeichen außer denjenigen in der Liste.

Innerhalb der Liste kann das Zeichen „-" benutzt werden, um einen Bereich oder eine Menge von Zeichen zu definieren. So definiert a-z alle Zeichen zwischen „a“ and „z“ inklusive.

Falls das Zeichen „-„ selbst ein Mitglied der Zeichenklasse sein soll, dann setze es als erstes oder letztes Zeichen in die Liste oder schütze es mit einem vorangestellten „\“ (escaping). Wenn das Zeichen „]“ ebenfalls Mitglied der Zeichenklasse sein soll, dann setze es als erstes Zeichen in die Liste oder escape es.

Beispiele

RegexHinweis
foob[aeiou]r
findet die Strings „foobar“, „foober“ etc. aber nicht „foobbr“, „foobcr“ etc.
foob[^aeiou]r
findet die Strings „foobbr“, „foobcr“ etc. aber nicht „foobar“, „foober“ etc.
[-az]
findet 'a', 'z' und '-'
[az-]
findet 'a', 'z' und '-'
[a\-z]
findet 'a', 'z' und '-'
[a-z]
findet alle 26 Kleinbuchstaben von 'a' bis 'z'
[\n-\x0D]
findet eines der Zeichen  #10, #11, #12 oder #13.
[\d-t] 
findet irgendeine Ziffer, '-' oder 't'.
[]-a]
findet irgendein Zeichen von ']'..'a'.

Metazeichen

Metazeichen sind Zeichen mit speziellen Bedeutungen. Sie sind die Essenz der regulären Ausdrücke. Es gibt verschiedene Arten von Metazeichen wie unten beschrieben.

Zeilenseparatoren

RegexHinweis
^
Beginn einer Zeile
$
Ende einer Zeile
\A
Textanfang
\Z
Textende
.
irgendein beliebiges Zeichen

Standardmässig garantiert das Metazeichen „^“ nur, dass das Suchmuster sich am Anfang des Zielstrings befinden muss, oder am Ende des Zielstrings mit dem Metazeichen „$“. Kommen im Zielstring Zeilenseparatoren vor, so werden diese von „^“ oder „$“ nicht gefunden.

Beispiele

RegexHinweis
^foobar
findet den String 'foobar' nur, wenn es am Zeilenanfang vorkommt
foobar$
findet den String 'foobar' nur, wenn es am Zeilenende vorkommt
^foobar$
findet den String 'foobar' nur, wenn er der einzige String in der Zeile ist
foob.r
findet Strings wie 'foobar', 'foobbr', 'foob1r' etc.

Wortgrenzen

Eine Wortgrenze (\b) is der Ort zwischen zwei Zeichen, welcher ein \w auf der einen und ein \W auf der anderen Seite hat bzw. umgekehrt. \b bezeichnet alle Zeichen des \w bis vor das erste Zeichen des \W bzw. umgekehrt.

RegexHinweis
\b
findet eine Wortgrenze
\B
findet alles außer einer Wortgrenze

Iteratoren

Jeder Teil eines regulären Ausdruckes kann gefolgt werden von einer anderen Art von Metazeichen – den Iteratoren. Dank dieser Metazeichen kann die Häufigkeit des Auftretens des Suchmusters im Zielstring definiert werden. Dies gilt jeweils für das vor diesem Metazeichen stehenden Zeichen, das Metazeichen oder den Teilausdruck.

RegexHinweis
*

kein- oder mehrmaliges Vorkommen ("gierig"), gleichbedeutend wie {0,}

+
ein- oder mehrmaliges Vorkommen ("gierig"), gleichbedeutend wie {1,}
?
kein- oder einmaliges Vorkommen  ("gierig"), gleichbedeutend wie {0,1}
{n}
genau n-maliges Vorkommen ("gierig")
{n,}
mindestens n-maliges Vorkommen ("gierig")
{n,m}
mindestens n-, aber höchstens m-maliges Vorkommen ("gierig")
*?
kein- oder mehrmaliges Vorkommen ("genügsam"), gleichbedeutend wie {0,}?
+?
ein oder mehrmaliges Vorkommen ("genügsam"), gleichbedeutend wie {1,}?
??
kein- oder einmaliges Vorkommen ("genügsam"), gleichbedeutend wie {0,1}?
{n}?
genau n-maliges Vorkommen ("genügsam")
{n,}?
mindestens n-maliges Vorkommen ("genügsam")
{n,m}?
mindestens n-, aber höchstens m-maliges Vorkommen ("genügsam")

Also, die Ziffern in den geschweiften Klammern in der Form {n,m} geben an, wieviele Male das Suchmuster im Zielstring gefunden muss, um einen Treffer zu ergeben. Die Angabe {n} ist gleichbedeutend wie {n,n} und findet genau n Vorkommen. Die Form {n,} findet n oder mehre Vorkommen. Es gibt keine Limitierungen für die Zahlen n und m. Aber je rösser sie sind, desto mehr Speicher und Zeit wird benötigt, um den regulären Ausdruck auszuwerten.

Falls eine geschweifte Klammer in einem anderen als dem eben vorgestellten Kontext vorkommt, wird es wie ein normales Zeichen behandelt.

Beispiele

RegexHinweis
foob.*r
findet Strings wie 'foobar',  'foobalkjdflkj9r' und 'foobr'
foob.+r
findet Strings wie 'foobar', 'foobalkjdflkj9r', aber nicht 'foobr'
foob.?r
findet Strings wie 'foobar', 'foobbr' und 'foobr', aber nicht 'foobalkj9r'
fooba{2}r
findet den String 'foobaar'
fooba{2,}r
findet Strings wie 'foobaar', 'foobaaar', 'foobaaaar' etc.
fooba{2,3}r
findet Strings wie 'foobaar', or 'foobaaar', aber nicht 'foobaaaar'

Eine kleine Erklärung zum Thema "gierig" oder "genügsam". "Gierig" nimmt soviel wie möglich, wohingegen "genügsam" bereits mit dem ersten Erfüllen des Suchmusters zufrieden ist. Beispiel: 'b+' und 'b*' angewandut auf den Zielstring 'abbbbc' findet 'bbbb', 'b+?' findet 'b', 'b*?' findet den leeren String, 'b{2,3}?' findet 'bb', 'b{2,3}' findet 'bbb'.

Alternativen

Sie können eine Serie von Alternativen für eine Suchmuster angeben, indem diese mit einem "|'' trennen. Auf diese Art findet das Suchmuster fee|fie|foe eines von "fee", "fie", oder "foe" im Zielstring – dies würde auch mit f(e|i|o)e erreicht.

Die erste Alternative beinhaltet alles vom letzten Muster-Limiter ("(", "[" oder natürlich der Anfang des Suchmusters) bis zum ersten "|".Die letzte Alternative beinhaltet alles vom letzten "|" bis zum nächsten Muster-Limiter. Aus diesem Grunde ist es allgemein eine gute Gewohnheit, die Alternativen in Klammern anzugeben, um möglichen Missverständnissen darüber vorzubeugen, wo die Alternativen beginnen und enden.

Alternativen werden von links nach rechts geprüft, so dass der Treffer im Zielstring zusammengesetzt ist aus den jeweils zuerst passenden Alternativen. Das bedeutet, dass Alternativen nicht notwendigerweise "gierig" sind. Ein Beispiel: Wenn man mit "(foo|foot)" im Zielstring "barefoot" sucht, so passt bereits die erste Variante. Diese Tatsache mag nicht besonders wichtig erscheinen, aber es ist natürlich wichtig, wenn der gefundene Text weiterverwendet wird. Im Beispiel zuvor würde der Benutzer nicht "foot" erhalten, wie er eventuell beabsichtigt hatte, sondern nur "foo".

Erinnern Sie sich auch daran, dass das "|" innerhalb von eckigen Klammern wie ein normales Zeichen behandelt wird, so dass [fee|fie|foe] dasselbe bedeutet wie [feio|].

Beispiel

RegexHinweis
foo(bar|foo)
findet die Strings 'foobar' oder 'foofoo'

Teilausdrücke

Das Klammerkonstrukt (...) wird auch dazu benutzt, reguläre Teilausdrücke zu definieren.

Teilausdrücke werden nummeriert von links nach recht, jeweils in der Reihenfolge ihrer öffnenden Klammer. Der erste Teilausdruck hat die Nummer 1, der gesamte reguläre Ausdruck hat die Nummer 0.

Beispiele

RegexHinweis
(foobar){8,10}
findet Strings, die 8, 9 oder 10 Vorkommen von 'foobar' beinhalten
foob([0-9]|a+)r
findet 'foob0r', 'foob1r' , 'foobar', 'foobaar', 'foobaar' etc.

Rückwärtsreferenzen

Die Metacharacters \1 bis \9 werden in Suchmustern interpretiert als Rückwärtsreferenzen. \<n> findet einen zuvor bereits gefundenen Teilausdruck #<n>.

Beispiele

RegexHinweis
(.)\1+
findet 'aaaa' und 'cc'
(.+)\1+
findet auch 'abab' und '123123'
(['"]?)(\d+)\1
findet "13" (innerhalb "), oder '4' (innerhalb ') oder auch 77, etc.

Beispiele

InfoRegex

eMail-Adressen

[_a-zA-Z\d\-\.]+@[_a-zA-Z\d\-]+(\.[_a-zA-Z\d\-]+)+

Datum (DE)

\d{1,2}\.\d{1,2}\.\d{2,4}

6 stelliger numerischer Wert

\d{6}

CLARC Lizenznummern

\CC[A-Z][CDEILPTY](0[1-9]|1[012])\d{6}