Reguläre Ausdrücke (RegEx) - Kurzübersicht

Grundlagen

Mehrere Treffer: Mit einem regulären Ausdruck, kurz RegEx, sucht man ein bestimmtes Muster innerhalb einer Zeichenkette, das in der Regel mehrmals gefunden werden kann. Zum Beispiel kann der reguläre Ausdruck abc in den Zeichenketten abc123, 123abc und 123abcxyz gefunden werden. Der reguläre Ausdruck kann um einen Anker ergänzt werden, wenn das Suchmuster nur am Anfang oder Ende einer Zeichenkette gefunden werden soll.

Escapezeichen: Die meisten Zeichen wie abc123 können direkt in einem regulären Ausdruck verwendet werden. Wenn man aber eines der Funktionszeichen \.*?+[{|()^$ suchen muss, ist es notwendig, einen umgekehrten Schrägstrich davorzusetzen. Zum Beispiel wäre \. ein normaler Punkt und \\ ein normaler umgekehrter Schrägstrich. Mithilfe von \Q...\E kann eine komplette Zeichenkette angegeben werden, ohne darin ein Zeichen mit einem umgekehrten Schrägstrich versehen zu müssen. Zum Beispiel: \QNormaler Text\E.

Groß-/Kleinschreibung: Standardmäßig beachten reguläre Ausdrücke die Groß-/Kleinschreibung. Mit der "i"-Option kann das geändert werden. Das Muster i)abc würde beispielsweise nach "abc" suchen, egal ob es klein oder groß geschrieben ist.

Optionen (Groß-/Kleinschreibung beachten)

Die folgenden Optionen müssen am Anfang eines regulären Ausdrucks stehen, gefolgt von einer schließenden Klammer. Wenn keine Optionen vorhanden sind, kann die schließende Klammer weggelassen werden. Zum Beispiel würde "im)abc" nach abc suchen, wo die Groß-/Kleinschreibung egal ist und die Suche über mehrere Zeilen erfolgt. Im Vergleich zu anderen Programmiersprachen ist diese Schreibweise ziemlich ungewöhnlich. Sie hat aber den Vorteil, dass keine speziellen Trennzeichen (z. B. der Schrägstrich) notwendig sind, um einen regulären Ausdruck von einem normalen Text zu unterscheiden, und demzufolge solche Trennzeichen innerhalb des Musters nicht mit einem Escapezeichen versehen werden müssen. Darüber hinaus sind die Optionen mit dieser Schreibweise einfacher vom Programm zu parsen, was sich positiv auf die Performance auswirkt.

i Wenn diese Option aktiv ist, stimmen Buchstaben im Suchmuster sowohl mit Groß- als auch Kleinbuchstaben überein.
m

Multiline-Modus. Die zu durchsuchende Zeichenkette wird nicht als durchgehende Zeile, sondern als Ansammlung einzelner Zeilen angesehen (sofern Zeilenumbrüche enthalten sind). Folgende Änderungen treten dabei in Kraft:

1) Zirkumflex (^) ist nicht nur der Anfang der Zeichenkette, sondern auch der Anfang jeder neuen Zeile, also direkt nach jedem Zeilenumbruch (aber nicht nach einem Zeilenumbruch ganz am Ende der Zeichenkette).

2) Dollar-Zeichen ($) ist nicht nur das Ende der Zeichenkette, sondern auch das Ende jeder neuen Zeile, also direkt vor jedem Zeilenumbruch.

Zum Beispiel kann das Muster "m)^abc$" nur mit der Zeichenkette "xyz`r`nabc" übereinstimmen, wenn die "m"-Option vorhanden ist.

Die "D"-Option wird ignoriert, wenn "m" vorhanden ist.

s DotAll-Modus. Bewirkt, dass ein Punkt (.) mit allen Zeichen übereinstimmt, einschließlich Zeilenumbrüche (normalerweise stimmt er nicht mit Zeilenumbrüchen überein). Beachte, dass ein Zeilenumbruch üblicherweise aus zwei Zeichen besteht (`r`n), demzufolge sind zwei Punkte für eine Übereinstimmung erforderlich. Diese Option hat keinen Einfluss auf negative Klassen wie z. B. [^a] - diese Art von Klassen stimmen immer mit Zeilenumbrüchen überein.
x Wenn diese Option aktiv ist, werden Leerraumzeichen im regulären Ausdruck ignoriert, es sei denn, sie haben ein Escapezeichen davor oder befinden sich in einer Zeichenklasse. Die Zeichen `n und `t werden auch ignoriert, weil sie in einem regulären Ausdruck bereits als normale Leerraumzeichen behandelt werden (im Gegensatz zu \n und \t, die PCRE-Escapesequenzen sind). Die x-Option ignoriert zudem Zeichen außerhalb einer Zeichenklasse, die sich zwischen einer Raute (#) ohne Escapezeichen und einem Zeilenumbruchszeichen befinden. Auf diese Weise kann man Kommentare in ein kompliziertes Muster einfügen. Beachte aber, dass dies nur für Datenzeichen gilt. Leerraumzeichen dürfen niemals innerhalb einer Folge spezieller Zeichen auftreten, wie z. B. (?(, die einen bedingten Teilausdruck einleiten würde.
A Erzwingt die Verankerung des Suchmusters; das heißt, dass das Suchmuster mit dem Anfang der Zeichenkette übereinstimmen muss. Diese Option ist prinzipiell das gleiche wie, als würde man das Suchmuster explizit mit "^" verankern.
D Bewirkt, dass das Dollar-Zeichen ($) mit dem Ende der Zeichenkette übereinstimmen muss, selbst wenn das letzte Zeichen in der Zeichenkette ein Zeilenumbruch ist. Wenn diese Option nicht vorhanden ist, erfolgt die Übereinstimmung vor dem letzten Zeilenumbruch (falls vorhanden). Hinweis: Diese Option wird ignoriert, wenn "m" vorhanden ist.
J Erlaubt benannte Teilsuchmuster mit gleichem Namen. Diese Option ist in einem Suchmuster nützlich, wo nur eines von mehreren gleichnamigen Teilsuchmustern übereinstimmen kann. Hinweis: Wenn mehrere gleichnamige Teilsuchmuster eine Übereinstimmung finden, wird nur der gefundene Treffer ganz links gespeichert. Groß-/Kleinschreibung spielt bei Variablennamen keine Rolle.
U Ungreedy-Modus. Bringt die Quantoren *+?{} dazu, so wenig Zeichen wie möglich zu verbrauchen, um einen Treffer zu erzeugen. Die restlichen noch verfügbaren Zeichen gelten für den nächsten Teil des Suchmusters. Normalerweise kann man, wenn die U-Option inaktiv ist, einen einzelnen Quantor ungreedy machen, indem man direkt danach ein Fragezeichen einfügt. Bei aktivierter U-Option bewirkt das Fragezeichen genau das Gegenteil - es macht einen einzelnen Quantor greedy.
X PCRE_EXTRA. Aktiviert PCRE-Features, die mit Perl nicht kompatibel sind. Aktuell gibt es nur ein Feature. Dieses Feature bewirkt, dass jeder umgekehrter Schrägstrich, gefolgt von einem Buchstaben ohne besondere Bedeutung, eine Übereinstimmung fehlschlagen lässt, woraufhin ErrorLevel gesetzt wird. Mit dieser Option können ungenutzte Backslash-Sequenzen für die zukünftige Verwendung reserviert werden. Wenn diese Option fehlt, wird der umgekehrte Schrägstrich vor einem normalen Buchstaben einfach ignoriert (das heißt beispielsweise, dass sowohl \g als auch g ein normales g ist). Der umgekehrte Schrägstrich vor einem normalen nicht-alphabetischen Zeichen wird immer ignoriert (das heißt beispielsweise, dass sowohl \/ als auch / ein gewöhnlicher Schrägstrich ist).
P Positionsmodus. Wenn diese Option aktiv ist, wird RegExMatch() nicht die gefundenen Teilzeichenketten, sondern die Position und Länge der gefundenen Übereinstimmung und ihrer Teilsuchmuster zurückgeben. Für weitere Details, siehe NichtZitierteAusgabeVar.
S Untersucht, ob die Performance des Suchmusters verbessert werden kann. Diese Option ist bei einem Suchmuster nützlich, das sehr oft ausgeführt wird (besonders wenn es komplex aufgebaut ist). Wenn PCRE einen Weg gefunden hat, die Performance zu verbessern, wird PCRE diese Entdeckung zusammen mit dem Suchmuster in den Cache speichern, um sie später auf nachfolgende Suchmuster gleicher Art anzuwenden (auch diese Suchmuster sollten die S-Option enthalten, weil sie nur im Cache gefunden werden können, wenn die Optionsbuchstaben vorhanden und in gleicher Reihenfolge sind).
C Aktiviert den Auto-Callout-Modus. Siehe Callouts in regulären Ausdrücken für weitere Informationen.
`n Wechselt vom Standard-Zeilenumbruch (`r`n) auf ein einzelnes LF-Zeichen (`n), welches üblicherweise auf UNIX-Systemen von Bedeutung ist. Ein anderes Zeilenumbruchszeichen beeinflusst das Verhalten von Verankerungen (^ und $) und Suchmuster mit Punkten.
`r Wechselt vom Standard-Zeilenumbruch (`r`n) auf ein einzelnes CR-Zeichen (`r).
`a Seit v1.0.46.06 kann man `a benutzen, um jede Zeilenumbruchsvariante erkennen zu lassen: `r, `n, `r`n, `v/VT/vertical tab/chr(0xB), `f/FF/formfeed/chr(0xC) und NEL/next-line/chr(0x85). Seit v1.0.47.05 kann man (*ANYCRLF) am Anfang eines Suchmusters (nach den Optionen) angeben, um Zeilenumbrüche nur auf CR, LF und CRLF zu beschränken; zum Beispiel: im)(*ANYCRLF)^abc$.

Hinweis: Bei Bedarf kann man die Optionen mit Leer- und Tabulatorzeichen voneinander trennen.

Häufig verwendete Symbole und Syntax

. Der Platzhalter für ein beliebiges einzelnes Zeichen. Zeilenumbrüche (`r`n) werden nur erkannt, wenn man DotAll (s), LF (`n), CR (`r), `a oder (*ANYCRLF) benutzt. Zum Beispiel würde ab. mit abc und abz und ab_ übereinstimmen.
*

Ein Platzhalter, der überprüft, ob das voherige Element (Zeichen, Klasse oder Teilsuchmuster) gar nicht oder mehrmals vorkommt. Zum Beispiel würde a* mit ab und aaab übereinstimmen. Eine Übereinstimmung würde auch erfolgen, wenn die Zeichenkette überhaupt kein "a" enthält.

Punkt-Sternchen-Platzhalter: .* ist eines der tolerantesten Suchmuster, weil es keine oder mehrere Vorkommen eines beliebigen Zeichens finden kann (außer Zeilenumbruch: `r und `n). Zum Beispiel würde abc.*123 sowohl mit abcIrgendetwas123 als auch mit abc123 übereinstimmen.

? Ein Platzhalter, der überprüft, ob das vorherige Element (Zeichen, Klasse oder Teilsuchmuster) vorkommt oder nicht. Oder auch: "Das voranstehende Element ist optional". Zum Beispiel würde colou?r sowohl mit color als auch mit colour übereinstimmen, weil das "u" optional gemacht wurde.
+ Ein Platzhalter, der überprüft, ob das vorherige Element (Zeichen, Klasse oder Teilsuchmuster) mehr als einmal vorkommt. Zum Beispiel würde a+ mit ab und aaab übereinstimmen. Im Gegensatz zu a* und a? kann a+ nur eine Übereinstimmung finden, wenn "a" in der Zeichenkette vorkommt.
{min,max}

Ein Platzerhalter, der überprüft, ob das vorherige Element (Zeichen, Klasse oder Teilsuchmuster) min-mal bis max-mal vorkommt. Zum Beispiel würde a{1,2} mit ab übereinstimmen, aber mit aaab nur die ersten zwei a's.

Zudem kann man beispielsweise {3} angeben, um genau 3 Vorkommen finden zu lassen, oder {3,} für 3 oder mehr Vorkommen. Hinweis: Die angegebenen Werte müssen kleiner als 65.536 sein. Außerdem muss der Minimalwert entweder kleiner oder genauso groß wie der Maximalwert sein.

[...]

Zeichenklassen: Ein Platzhalter, der überprüft, ob das aktuelle Zeichen mit eines der definierten Zeichen in den eckigen Klammern übereinstimmt. Zum Beispiel bedeutet [abc]: "jedes Zeichen, das entweder ein a, b oder c ist". Mithilfe eines Bindestrichs kann ein Bereich definiert werden; zum Beispiel bedeutet [a-z]: "jedes Zeichen von a bis z". Listen und Bereiche können kombiniert werden; zum Beispiel bedeutet [a-zA-Z0-9_]: "jedes Zeichen, das alphanumerisch oder ein Unterstrich ist".

Nach einer Zeichenklasse kann *, ?, + oder {min,max} erfolgen. [0-9]+ überprüft beispielsweise, ob eine Ziffer mehr als einmal vorkommt; somit würde es mit xyz123 übereinstimmen, aber nicht mit abcxyz.

Desweiteren kann man vordefinierte Zeichenbereiche (POSIX) in Form von [[:xxx:]] angeben; xxx ist dabei eines der folgenden Wörter: alnum, alpha, ascii (0-127), blank (Leerzeichen oder Tabulator), cntrl (Steuerzeichen), digit (0-9), xdigit (hexadezimale Ziffern), print, graph (print ohne space), punct, lower, upper, space (Leerraumzeichen), word (das gleiche wie \w).

Innerhalb einer Zeichenklasse müssen nur Zeichen mit einem Escapezeichen versehen werden, die innerhalb der Klasse eine besondere Bedeutung haben; z. B. [\^a], [a\-b], [a\]] und [\\a].

[^...] Ein Platzhalter, der überprüft, ob das aktuelle Zeichen mit keines der definierten Zeichen in den eckigen Klammern übereinstimmt. [^/]* findet beispielsweise nur nebeneinanderliegende Zeichen, die kein Schrägstrich sind, wie z. B. http://. Ein weiteres Beispiel wäre [^0-9xyz], das nur einzelne Zeichen finden kann, die weder Zahlen noch die Buchstaben x, y oder z sind.
\d Der Platzhalter für eine einzelne Ziffer (entspricht der Klasse [0-9]). Ein großgeschriebenes \D ist hingegen der Platzhalter für ein einzelnes Zeichen, das keine Ziffer ist. Dieser und die anderen zwei Platzhalter darunter können innerhalb einer Klasse verwendet werden; zum Beispiel bedeutet [\d.-]: "jede Ziffer, jeder Punkt oder jedes Minuszeichen".
\s Der Platzhalter für ein einzelnes Leerraumzeichen, wie z. B. Leerzeichen, Tabulator oder Zeilenumbruch (`r und `n). Ein großgeschriebenes \S ist hingegen der Platzhalter für ein einzelnes Zeichen, das kein Leerraumzeichen ist.
\w Der Platzhalter für ein einzelnes Zeichen, das in der Regel in einem Wort zu finden ist, also alphanumerisch oder Unterstrich. Das ist das gleiche wie [a-zA-Z0-9_]. Ein großgeschriebenes \W ist hingegen der Platzhalter für ein einzelnes Zeichen, das nicht in einem Wort zu finden ist.
^
$

Zirkumflex (^) und Dollar-Zeichen ($) werden Anker genannt, weil sie das Suchmuster an den Anfang oder Ende der zu durchsuchenden Zeichenkette binden. Sie verbrauchen keine Zeichen.

^ kann am Anfang eines Musters stehen, um die Übereinstimmung direkt am Anfang einer Zeile erfolgen zu lassen. Zum Beispiel würde ^abc mit abc123 übereinstimmen, aber nicht mit 123abc.

$ kann am Ende eines Musters stehen, um die Übereinstimmung direkt am Ende einer Zeile erfolgen zu lassen. Zum Beispiel würde abc$ mit 123abc übereinstimmen, aber nicht mit abc123.

Beide Anker können gleichzeitig verwendet werden. Zum Beispiel kann ^abc$ nur mit abc übereinstimmen (das heißt, dass sich keine Zeichen davor oder dahinter befinden dürfen).

Wenn der zu durchsuchende Text mehrere Zeilen enthält, kann man die m-Option benutzen, um die Anker nicht für den gesamten Text, sondern für jede Zeile geltend zu machen. Zum Beispiel würde m)^abc$ mit 123`r`nabc`r`n789 übereinstimmen. Ohne m-Option wäre keine Übereinstimmung möglich.

\b \b dient als Abgrenzung eines Wortes. Es ist wie ein Anker, weil es keine Zeichen verbraucht. Es setzt voraus, dass das aktuelle Zeichen, welches ein Wortzeichen (\w) sein muss, das Gegenteil des vorherigen Zeichens ist. Dadurch kann man in der Regel verhindern, dass das gesuchte Wort innerhalb eines anderen Wortes gefunden wird. Zum Beispiel würde \bcat\b nicht mit catfish übereinstimmen, sondern nur mit cat, unabhängig von Interpunktion und Leerraumzeichen. Ein großgeschriebenes \B bewirkt genau das Gegenteil: Es setzt voraus, dass das aktuelle Zeichen nicht neben einer Wortabgrenzung zu finden ist.
| Der senkrechte Strich trennt zwei oder mehr Alternativen. Eine Übereinstimmung erfolgt, wenn eine der Alternativen zutrifft. Zum Beispiel würde gray|grey sowohl mit gray als auch mit grey übereinstimmen. Das Suchmuster gr(a|e)y bewirkt das gleiche, allerdings muss man dazu die unten beschriebenen Klammern verwenden.
(...)

Eingeklammerte Elemente werden häufig verwendet, ...:

  • ... um die Reihenfolge der Auswertung zu bestimmen. Zum Beispiel würde (Sonn|Mon|Diens|Donners|Frei|Sams)tag|Mittwoch den Namen jeden Tages finden.
  • ... um *, ?, + oder {min,max} auf mehrere Zeichen anzuwenden. (abc)+ überprüft beispielsweise, ob "abc" mehr als einmal vorkommt; es wäre also in abcabc123 zu finden, aber nicht in ab123 oder bc123.
  • ... um ein Teilsuchmuster zur Weiterverarbeitung zu erfassen, wie der Punkt-Stern-Platzhalter in abc(.*)xyz. Nur so kann RegExMatch() ihre gefundene Zeichenketten in das Ausgabe-Array speichern. Und nur so kann RegExReplace() ihre gefundene Zeichenketten in die resultierende Zeichenkette via Rückreferenz (z. B. $1) neu einfügen. Um zu verhindern, dass das Suchmuster in den Klammern erfasst wird, ist es notwendig, die zwei Zeichen ?: direkt nach der öffnenden Klammer einzufügen; zum Beispiel: (?:.*)
  • ... um Optionen spontan zu ändern. Wenn man (?im) beispielsweise irgendwo in das Suchmuster einfügt, werden die Optionen nur für den restlichen Teil des Suchmusters (oder Teilsuchmusters) aktiv. (?-im) würde hingegen beide Optionen ausschalten. Es werden alle Optionen außer DPS`r`n`a unterstützt.
\t
\r
usw.

Die Platzhalter für Sonderzeichen. Die am häufigsten verwendeten Platzhalter dieser Art sind \t (Tabulator), \r (CR-Zeichen) und \n (LF-Zeichen). In AutoHotkey kann der umgekehrte Schrägstrich von solchen Platzhaltern mit einem umgekehrten Häkchen (`) ersetzt werden. Platzhalter in Form von \xhh werden ebenfalls unterstützt; hh ist dabei der hexadezimale Code eines beliebigen ANSI-Zeichens zwischen 00 und FF.

Seit v1.0.46.06 kann man den Platzhalter \R verwenden. Er bedeutet: "jeder Zeilenumbruch beliebiger Art". Das sind quasi alle Zeilenumbrüche, die bei der `a-Option aufgelistet sind (innerhalb einer Zeichenklasse wird \R lediglich als ein normales "R" behandelt). Seit v1.0.47.05 kann \R auf CR, LF, und CRLF beschränkt werden, indem man (*BSR_ANYCRLF) in Großbuchstaben am Anfang eines Musters (nach den Optionen) angibt; zum Beispiel: im)(*BSR_ANYCRLF)abc\Rxyz

\p{xx}
\P{xx}
\X

[AHK_L 61+]: Platzhalter für Unicode-Zeichen. In der ANSI-Version von AutoHotkey werden sie nicht unterstützt. \p{xx} überprüft, ob ein Zeichen die xx-Eigenschaft hat, während \P{xx} überprüft, ob es ein Zeichen ohne xx-Eigenschaft ist. Zum Beispiel würde \pL mit einen beliebigen Buchstaben übereinstimmen, während \p{Lu} mit einem beliebigen Großbuchstaben übereinstimmen würde. \X stimmt mit einer beliebigen Anzahl an Zeichen überein, die eine erweiterte Unicode-Sequenz bildet.

Suche nach "\p{xx}" auf www.pcre.org/pcre.txt, um eine vollständige Liste der unterstützten Eigenschaftsnamen zu erhalten und um weitere Details zu erfahren.

(*UCP)

[AHK_L 61+]: Aus Performance-Gründen stimmen die Platzhalter \d, \D, \s, \S, \w, \W, \b und \B standardmäßig nur mit ASCII-Zeichen überein, auch in der Unicode-Version von AutoHotkey. Wenn das Suchmuster mit (*UCP) beginnt, werden Unicode-Eigenschaften zum Finden von Zeichen benutzt. Zum Beispiel wäre \w dann [\p{L}\p{N}_] und \d dann \p{Nd}.

Greed (Gier): Standardmäßig versuchen die Quantoren *, ?, +, und {min,max}, so viele Zeichen wie möglich einzubeziehen, um eine Übereinstimmung zu finden. Um sie auf so wenig Zeichen wie möglich zu begrenzen, muss man danach ein Fragezeichen einfügen. Zum Beispiel würde das Suchmuster <.+> (also ohne Fragezeichen) bedeuten: "suche nach <, gefolgt von mindestens einem Zeichen, gefolgt von >". Um zu verhindern, dass das Suchmuster mit der kompletten Zeichenkette <em>text</em> übereinstimmt, muss man hinter dem Pluszeichen ein Fragezeichen einfügen: <.+?>. Die Suche stoppt bereits beim ersten '>' und führt dazu, dass das erste HTML-Tag <em> die gefundene Übereinstimmung ist.

Vorausschauende und zurückschauende Behauptungen: Die Gruppen (?=...), (?!...), (?<=...) und (?<!...) werden Behauptungen genannt und verlangen, dass eine Bedingung erfüllt sein muss. Sie verbrauchen keine Zeichen. Zum Beispiel wäre abc(?=.*xyz) eine vorausschauende Behauptung, die verlangt, dass die Zeichenkette xyz irgendwo rechts neben der Zeichenkette abc vorkommen muss (wenn sie dort nicht ist, gilt das gesamte Suchmuster als keine Übereinstimmung). (?=...) nennt sich positives Vorausschauen, weil sie verlangt, dass das angegebene Suchmuster existieren muss. (?!...) nennt sich hingegen negatives Vorausschauen, weil sie verlangt, dass das angegebene Suchmuster fehlen muss. Im Vergleich dazu ist (?<=...) und (?<!...) positives und negatives Zurückschauen, weil sie auf der linken statt rechten Seite der aktuellen Position nachschauen. Zurückschauende Behauptungen haben mehr Einschränkungen als vorausschauende Behauptungen, weil sie keine Quantoren mit variierbarer Größe unterstützen, wie z. B. *, ? und +. Die Escapesequenz \K ist mit einer zurückschauenden Behauptung vergleichbar, weil sie alle zuvor gefundenen Zeichen im Endergebnis wegfallen lässt. Zum Beispiel würde foo\Kbar mit "foobar" übereinstimmen, aber melden, dass nur "bar" gefunden wurde.

Siehe auch: RegExMatch(), RegExReplace() und SetTitleMatchMode unterstützen reguläre Ausdrücke.

Abschließende Bemerkung: Beachte, dass diese Seite nur RegEx-Features umfasst, die häufig zum Einsatz kommen. Andere Features wie z. B. bedingte Teilsuchmuster fehlen gänzlich. Das komplette Handbuch über PCRE findest du auf www.pcre.org/pcre.txt.