Reguläre Ausdrücke
- Former user (Deleted)
- Dennis Balzuweit
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
Regex | Hinweis |
---|---|
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.
Regex | Beschreibung |
---|---|
\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
Regex | Hinweis |
---|---|
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
Regex | Hinweis |
---|---|
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
Regex | Hinweis |
---|---|
^ | 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
Regex | Hinweis |
---|---|
^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.
Regex | Hinweis |
---|---|
\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.
Regex | Hinweis |
---|---|
* | 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
Regex | Hinweis |
---|---|
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
Regex | Hinweis |
---|---|
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
Regex | Hinweis |
---|---|
(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
Regex | Hinweis |
---|---|
(.)\1+ | findet 'aaaa' und 'cc' |
(.+)\1+ | findet auch 'abab' und '123123' |
(['"]?)(\d+)\1 | findet "13" (innerhalb "), oder '4' (innerhalb ') oder auch 77, etc. |
Beispiele
Info | Regex |
---|---|
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} |