Reguläre Ausdrücke

Einleitung

Mit regulären Ausrücken kann nicht nur nach einem ganz bestimmten Suchbegriff gesucht werden, sondern es sind beliebig komplizierte Suchanfragen möglich. Mit Sonderzeichen können Suchbegriffe zusammengesetzt werden, so dass nicht nur ein einzelner Begriff gefunden wird, sondern genau definierte Kombinationen von Begriffen.

Falls Sie mit Ausdrücken wie '*.txt', z.B. beim Dateimanagement, bereits gearbeitet haben, ist Ihnen das Prinzip der regulären Ausdrücke bereits bekannt. Einzelne Sonderzeichen (wie hier der '*') haben eine spezielle Bedeutung und stehen z.B. für beliebigen Text (der '*' steht bei diesem Beispiel als Platzhalter für einen beliebigen Dateinamen).

Ähnlich verhält es sich mit den hier verwendeten regulären Ausdrücken. So findet beispielsweise 'fi.*?en' beliebige Ausdrücke, die mit 'fi' beginnen und mit 'en' aufhören (z.B. finden, finnen etc...) wobei das '?' angibt, das jeweils die kürzeste Möglichkeit gesucht werden soll.

Nachfolgend finden Sie einige Erläuterungen zu den einzelnen Operatoren und deren Bedeutung.

Operatoren

Ausführliche Erklärungen weiter unten.

Zeichen Bedeutung
. steht für ein beliebiges Zeichen (genau ein)
| Oder. Bsp: 'a(b|c)' findet 'ab' oder 'ac'
* Wiederholung: Das Zeichen vor "*" kann beliebig oft vorkommen (einschliesslich null mal). Bsp: ba* findet b ba, baa, baaa, usw.
+ wie * aber ohne null mal. Bsp: ba* findet ba, baa, baaa, usw. aber nicht b
? wie * aber nur einfache Wiederholung. Bsp: ba? findet b, ba aber nicht baa

folgt es einem '*' oder '+' findet es bei Wiederholungen die kürzest mögliche Zeichenfolge (sonst längste). Bsp: 'f.*?n' findet 'fin' und nicht 'finden'

(, ) Klammern zum gruppieren von Ausdrücken
{, } Der vor den Klammern stehende Ausdruck wird so oft repetiert wie zwischen den Klammern angegeben, für einen Bereich: {unteres Limit, oberes Limit} Bsp: 'ba{2,4}' findet  'baa', 'baaa' und 'baaaa'. Zwischen den Klammern darf kein Leerzeichen stehen!
[, ] Menge von Zeichen. Bsp: '[abc]' steht für 'a', 'b' oder 'c'. '[a-f]' steht für alle Zeichen von 'a' bis und mit 'f'.
$ Zeilenumbruch am Ende einer Zeile
^ Negation. Bsp: '^a' bedeutet alle Zeichen ausser 'a'

Zeilenumbruch am Anfang einer Zeile

\ Das nachfolgende Zeichen wird als gewöhnlicher Buchstabe aufgefasst und nicht als Sonderzeichen. Z.B. steht '\.' für einen Punkt und nicht als '\' gefolgt von einem beliebigen Zeichen.

Das folgende Zeichen ist ein Sonderzeichen. Bsp:'\n' repräsentiert das 'neue Linie' Zeichen

Wiederholungen

Wiederholungen von einzelnen Zeichen können durch die Zeichen '*', '+' oder '?' dargestellt werden. Ein Ausdruck gefolgt von einem '*' kann beliebig oft wiederholt werden (einschliesslich 0 mal), '+' bedeutet das selbe aber der Ausdruck  muss mindestens einmal vorkommen, während er bei '?' max. einmal vorkommen darf.
Soll der Ausdruck eine bestimmte Anzahl vorkommen, kann dem Ausdruck die Anzahl in geschweiften Klammern folgen z.B. '{3}'. '{2,5}' bedeutet, dass der Ausdruck min. 2 mal aber max. 5 mal vorkommen darf, während '{2,}' nur die untere Grenze angibt, also min. 2 mal. Zwischen den Klammern darf kein Leerzeichen stehen!
Der zu wiederholende Ausdruck kann ein einzelnes Zeichen, eine Zeichengruppe oder einen Ausdruck der mit '()' gruppiert wurde. 

Bsp: 

'ba*' findet 'b', 'ba', 'baa', 'baaa' ...
'ba+' findet  'ba' or 'baa' aber nicht 'b'.
'ba?' findet  'b' or 'ba'.
'ba{2,4}' findet  'baa', 'baaa' und 'baaaa'.

'(ba)*' findet 'ba', baba'... aber nicht 'baa'

Wird hinter '*' oder '+' ein '?' angehängt, wird die jeweils kürzeste Möglichkeit gefunden, ansonsten die längste.

Bsp:

'f.*?n' findet 'fin' und nicht 'finden'

'f.*n' findet 'finden' und nicht 'fin' (sofern nicht noch später ein 'n' folgt)

Gruppieren

Mit runden Klammern können Ausdrücke gruppiert werden.

Bsp:

'(ba)*' findet 'ba', baba'... aber nicht 'baa'

Alternativen

Mit dem Oder Operator '|' können alternativ verschiedene Ausdrücke gefunden werden.

Bsp:

 'a(b|c)' findet 'ab' oder 'ac'

'abc|def' findet 'abc' oder 'def'

Mengen

Mit den Eckigen Klammern '[' und ']' können Zeichen zu einer Menge zusammengefasst werden. Mit '^' können die Mengen negiert werden.

Bsp:

'[abc]' findet 'a', 'b' oder 'c'

'[^abc]' findet jedes Zeichen ausser 'a', 'b' oder 'c'

'[a-z]' findet jedes Zeichen von 'a' bis und mit 'z'

Spezielle Zeichen(mengen) können mit Klassen definiert werden. Klassen werden mit '[:klassenname]' definiert innerhalb einer Mengendeklaration.

Bsp:

'[[:digit]]' ist die Menge aller Ziffern (0-9)

 

Klassenname Bedeutung Abkürzung (Alternative)
alnum Ein beliebiges alphanumerisches Zeichen  
alpha Ein Buchstabe a-z oder A-Z. Je nach Zeichensatz können auch noch andere Buchstaben vorkommen  
blank unsichtbare Zeichen wie Leerzeichen oder Tabulatoren
cntrl Kontrollzeichen  
digit Ziffern von 0 bis 9 \d
graph grafisches Zeichen  
lower Kleinbuchstaben a-z. Je nach Zeichensatz können auch noch andere Buchstaben vorkommen \l
print druckbare Zeichen  
punct Punktierung  
space Leerzeichen ?? \s
upper Grossbuchstaben A-Z. Je nach Zeichensatz können auch noch andere Buchstaben vorkommen \u
xdigit Hexadezimale Ziffer, 0-9, a-f und A-F.  
word Wort - alphanumerische Zeichen plus Unterstrich '_'. \w
\W entspricht '[^[:word:]]'

Kode

Die Zeichen können auch durch ihren numerischen Kode repräsentiert werden, indem dem Schrägstrich '\' der Kode des Zeichens folgt. Hexadezimale Kodes können repräsentiert werden durch '\x' gefolgt vom Kode in Hex.

Bsp:

'\023' repräsentiert das Zeichen mit dem Kode 23.

'\xf0' repräsentiert das Zeichen mit dem Hex Kode f0.

Um Kode von folgenden Zeichen zu trennen können Klammern benutzt werden.

Bsp:

'\0105' repräsentiert das Zeichen mit Kode 105

'(\010)5' repräsentiert das Zeichen mit dem Kode 10 gefolgt von einer '5'

Sonderzeichen

Escape Sequenz Zeichen Kode Bedeutung
\a 0x07 Glocke.
\f 0x0C Form feed.
\n 0x0A Neue Zeile.
\r 0x0D Wagenrücklauf.
\t 0x09 Tabulator.
\v 0x0B Vertikaler Tabulator.
\e 0x1B ASCII Escape Zeichen.
\0dd 0dd Oktaler Zeichenkode, wobei dd eine oder mehrere oktale Ziffern ist.
\xXX 0xXX Hexadezimaler Zeichenkode, wobei XX eine oder mehrere hexadezimale Ziffern ist.
\x{XX} 0xXX Hexadezimaler Zeichenkode, wobei XX eine oder mehrere hexadezimale Ziffern ist (unicode)

Weitere Zeichen (für Kompatibilität zu Perl)

Zeichen dasselbe wie
\w [[:word:]]
\W [^[:word:]]
\s [[:space:]]
\S [^[:space:]]
\d [[:digit:]]
\D [^[:digit:]]
\l [[:lower:]]
\L [^[:lower:]]
\u [[:upper:]]
\U [^[:upper:]]
\C .
\Q, \E Alle dem '\Q' folgenden Zeichen werden als normale Zeichen interpretiert bis zu '\E'

Weiterführende Hilfe / Quelle:

Übersetzt und modifiziert aus: Dokumentation zu Boost::regex lib, (c) Dr John Maddock

Die original Dokumentation (etwas ausführlicher) kann hier gefunden werden: http://www.boost.org/libs/regex/syntax.htm (englisch)