Reguläre Ausdrücke (RegEx) - Kurzübersicht
Grundlagen
Übereinstimmungen sind überall: Standardmäßig stimmt ein regulärer Ausdruck mit einem Teilstring überall innerhalb des durchsuchten Strings überein. Zum Beispiel stimmt der reguläre Ausdruck abc mit abc123, 123abc und 123abcxyz überein. Damit die Übereinstimmung nur am Anfang oder Ende erfolgt, verwendet einen Anker.
Schutzzeichen: Die meisten Zeichen wie abc123 können direkt in einem regulären Ausdruck verwendet werden. Allerdings müssen die Zeichen \.*?+[{|()^$ mit einem Backslash vorangestellt werden, damit sie direkt verwendet werden. Zum Beispiel ist \. ein direkt vorhandener Punkt und \\ ist ein direkt vorhandener Backslash. Das Schützen kann mit \Q...\E verhindert werden. Zum Beispiel: \QDirekt vorhandener Text\E.
Abhängigkeit von Groß- und Kleinschreibung: Standardmäßig sind reguläre Ausdrücke von der Groß- und Kleinschreibung abhängig. Das kann mit der "i"-Option geändert werden. Zum Beispiel sucht das Muster i)abc nach "abc", ohne Rücksicht auf die Groß- und Kleinschreibung. Siehe unten für weitere Modifikatoren.
Optionen (von der Groß- und Kleinschreibung abhängig)
Am Anfang eines regulären Ausdrucks können beliebig viele Optionen stehen, gefolgt von einer schließenden Klammer. Zum Beispiel sucht das Muster "im)abc" nach abc auf mehreren Zeilen, unabhängig von der Groß- und Kleinschreibung (die Klammer kann weggelassen werden, falls keine Optionen vorhanden sind). Obwohl diese Syntax vom traditionellen Weg abweicht, benötigt es keine speziellen Trennzeichen (z. B. Schrägstrich), daher müssen diese Trennzeichen innerhalb des Musters nicht geschützt werden. Darüber hinaus wird die Performance verbessert, da die Optionen einfacher zu parsen sind.
| i | Übereinstimmung ist nicht von Groß- und Kleinschreibung abhängig, das heißt, dass die Buchstaben von A bis Z identisch zu ihren Gegenstücken in Kleinbuchstaben sind. |
| m | Mehrzeilig. Sieht den Heuhaufen als eine Ansammlung von einzelnen Zeilen (wenn Zeilenumbrüche vorhanden sind) und nicht als eine einzige durchgehende Zeile. Insbesondere wird dadurch Folgendes geändert:
Zum Beispiel stimmt das Muster "m)^abc$" erst mit dem Heuhaufen "xyz`r`nabc" überein, wenn die "m"-Option vorhanden ist. Die "D"-Option wird ignoriert, wenn "m" vorhanden ist. |
| s | DotAll. Dadurch stimmt der Punkt (.) mit allen Zeichen überein, einschließlich Zeilenumbrüche (normalerweise stimmt es nicht mit Zeilenumbrüchen überein). Wenn jedoch das Zeilenumbruch-Zeichen standardmäßig CRLF (`r`n) ist, dann sind zwei Punkte erforderlich, damit eine Übereinstimmung erfolgt. Unabhängig von dieser Option stimmt eine negative Klasse wie [^a] immer mit Zeilenumbrüchen überein. |
| x | Ignoriert unsichtbare Zeichen im Muster, solange sie nicht geschützt werden oder sich in einer Zeichenklasse befinden. Die Zeichen `n und `t dazwischen werden ignoriert, sobald sie im PCRE ankommen, weil sie da bereits als unbearbeitete/direkt vorhandene unsichtbare Zeichen behandelt werden (\n und \t werden hingegen nicht ignoriert, weil sie Schutzsequenzen im PCRE sind). Die x-Option ignoriert auch Zeichen zwischen einem nicht-geschützten # außerhalb einer Zeichenklasse und dem nächsten Zeilenumbruch-Zeichen. Damit ist es möglich, Kommentare innerhalb eines komplizierten Musters einzufügen. Dies gilt jedoch nur für Datenzeichen. Unsichtbare Zeichen können nie innerhalb spezieller Zeichenfolgen wie (?( auftauchen, die ein Bedingungsmuster starten. |
| A | Zwingt das Muster zu verankern; das heißt, es kann nur am Anfang des Heuhaufens übereinstimmen. In den meisten Fällen ist das gleichbedeutend mit der direkten Verankerung des Musters mithilfe von ^. |
| D | Zwingt Dollar-Zeichen ($), mit dem Ende des Heuhaufens übereinzustimmen, selbst wenn das letzte Zeichen im Heuhaufen ein Zeilenumbruch ist. Ohne diese Option erfolgt eine Übereinstimmung vor einem abschließenden Zeilenumbruch (falls vorhanden). Hinweis: Diese Option wird ignoriert, wenn "m" vorhanden ist. |
| J | Erlaubt doppelte benannte Teilausdrücke. Das ist für Muster nützlich, in denen nur ein Teilausdruck von gleichnamigen Teilausdrücken übereinstimmen kann. Hinweis: Wenn mehrere Instanzen des bestimmten Namens mit etwas übereinstimmen, dann wird nur die Instanz ganz links gespeichert. Auch sind Variablennamen nicht von Groß- und Kleinschreibung abhängig. |
| U | Ungreedy (nicht gierig). Die Quantoren *+?{} verbrauchen so wenig Zeichen wie möglich für eine Übereinstimmung und lassen den Rest für den nächsten Teilausdruck übrig. Wenn die "U"-Option nicht aktiv ist, dann kann die Gier eines beliebigen Quantors mit einem nachfolgendem Fragezeichen aufgehoben werden. Wenn hingegen "U" aktiv ist, dann macht das Fragezeichen einen beliebigen Quantor gierig. |
| X | PCRE_EXTRA. Ermöglicht PCRE-Funktionen, die mit Perl nicht kompatibel sind. Derzeit ist nur eine Funktion vorhanden, die eine Übereinstimmung mit jedem Backslash in einem Muster mit einem nachfolgendem Buchstaben ohne besondere Bedeutung fehlschlagen lässt und ErrorLevel demzufolge setzt. Diese Option hilft, unbenutzte Backslashs für die zukünftige Verwendung zu reservieren. Ohne diese Option wird ein Backslash mit einem nachfolgenden Buchstaben ohne besondere Bedeutung direkt behandelt (z. B. werden \g und g als ein direkt vorhandenes g angesehen). Unabhängig dieser Option werden nicht-alphabetische Backslash-Zeichenfolgen ohne besondere Bedeutung immer direkt behandelt (z. B. wird sowohl \/ wie auch / als Schrägstrich erkannt). |
| P | Positionsmodus. Dadurch gibt RegExMatch() die Position und Länge der Übereinstimmung und deren Teilausdrücke zurück, anstatt ihre passenden Teilstrings. Für weitere Details, siehe NichtZitierteAusgabevariable. |
| S | Überprüft das Muster, um die Performance zu verbessern. Das ist nützlich, wenn ein bestimmtes (besonders komplexes) Muster oft ausgeführt wird. Wenn PCRE einen Weg findet, die Performance zu verbessern, dann wird die Entdeckung zusammen mit dem Muster für nachfolgende Anwendungen desselben Musters in den Cache gespeichert (nachfolgende Verwendungen dieses Musters sollten auch die S-Option enthalten, weil notwendigerweise die Optionsbuchstaben und Reihenfolge exakt übereinstimmen müssen, um eine Übereinstimmung im Cache zu finden). |
| C | Aktiviert den Auto-Callout-Modus. Siehe Callouts in regulären Ausdrücken für weitere Informationen. |
| `n | Wechselt vom Standard-Unterbrechungszeichen (`r`n) zu einem LF-Zeichen (`n), welches Standard in UNIX-Systemen ist. Das ausgewählte Unterbrechungszeichen beeinflusst das Verhalten von Verankerungen (^ und $) und Muster mit Punkten. |
| `r | Wechselt vom Standard-Unterbrechungszeichen (`r`n) zu einem CR-Zeichen (`r). |
| `a | Seit v1.0.46.06 erkennt `a jede Art von Zeilenumbruch: `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 können Zeilenumbrüche mit (*ANYCRLF) am Anfang eines Musters (nach den Optionen) auf CR, LF und CRLF beschränkt werden, zum Beispiel: im)(*ANYCRLF)^abc$ |
Hinweis: Leerzeichen und Tabulatoren können verwendet werden, um jede Option voneinander zu trennen.
Häufig verwendete Symbole und Syntax
| . | Standardmäßig stimmt ein Punkt mit jedem Zeichen überein, das nicht zu einer Zeilenumbruchsreihe (`r`n) gehört. Dieses Verhalten kann jedoch geändert werden, wenn die Optionen DotAll (s), LF (`n), CR (`r), `a oder (*ANYCRLF) verwendet werden. Zum Beispiel stimmt ab. mit abc und abz und ab_ überein. |
| * | Mit dem Sternchen darf das voranstehende Element (Zeichen, Klasse oder Teilausdruck) kein- oder mehrmals vorkommen. Zum Beispiel stimmt a* mit ab und aaab überein. Es stimmt auch mit dem Anfang eines beliebigen Strings überein, der überhaupt kein "a" enthält. Platzhalter: Das Punkt-Sternchen-Muster .* ist sehr großzügig, weil es mit beliebig vielen Vorkommen eines beliebigen Zeichens übereinstimmt (außer Zeilenumbruch: `r und `n). Zum Beispiel stimmt abc.*123 mit abcAnything123 sowie mit abc123 überein. |
| ? | Mit dem Fragezeichen darf das voranstehende Element (Zeichen, Klasse oder Teilausdruck) kein- oder einmal vorkommen. Oder auch: "Das voranstehende Element ist optional". Zum Beispiel stimmt colou?r sowohl mit color als auch colour überein, weil das "u" optional ist. |
| + | Mit dem Pluszeichen darf das voranstehende Element (Zeichen, Klasse oder Teilausdruck) ein- oder mehrmals vorkommen. Zum Beispiel stimmt a+ mit ab und aaab überein. Aber im Gegensatz zu a* und a? stimmt das Muster a+ nicht mit dem Anfang eines Strings überein, dem ein "a"-Zeichen fehlt. |
| {min,max} | Damit darf das voranstehende Element (Zeichen, Klasse oder Teilausdruck) min- bis max-mal vorkommen. Zum Beispiel stimmt a{1,2} mit ab überein, bei aaab jedoch nur die ersten 2 "a"-Zeichen. Ebenso stimmt {3} mit genau 3 Vorkommen ein und {3,} mit 3 oder mehr Vorkommen. Hinweis: Die angegebenen Zahlen müssen kleiner als 65536 sein. Außerdem muss der erste Wert kleiner gleich der zweite Wert sein. |
| [...] | Zeichenklassen: Die eckigen Klammern umschließen eine Liste oder einen Bereich von Zeichen (oder beides). Zum Beispiel bedeutet [abc]: "jedes Zeichen, dass entweder ein a, b oder c ist". Mit einem Bindestrich wird ein Bereich erzeugt, 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, dass alphanumerisch oder ein Unterstrich ist". Nach einer Zeichenklasse kann *, ?, + oder {min,max} erfolgen. Zum Beispiel stimmt [0-9]+ mit einem oder mehreren Vorkommen von Ziffern überein, daher erfolgt eine Übereinstimmung mit xyz123, aber nicht mit abcxyz. Die folgenden POSIX-Sets werden auch in Form von [[:xxx:]] unterstützt, wobei xxx ein folgendes Wort sein kann: alnum, alpha, ascii (0-127), blank (Leerzeichen oder Tabulator), cntrl (Steuerzeichen), digit (0-9), xdigit (hexadezimale Ziffern), print, graph (print ohne Leerzeichen), punct, lower, upper, space (unsichtbare Zeichen), word (wie \w). Innerhalb einer Zeichenklasse müssen die Zeichen nicht geschützt werden, es sei denn, sie haben eine besondere Bedeutung in der Klasse; z. B. [\^a], [a\-b], [a\]] und [\\a]. |
| [^...] | Stimmt mit jedem Zeichen überein, das nicht in der Klasse ist. Zum Beispiel stimmt [^/]* mit beliebig vielen Vorkommen überein, die kein Schrägstrich enthalten, wie z. B. http://. Ebenso stimmt [^0-9xyz] mit jedem Zeichen überein, dass keine Zahl oder nicht der Buchstabe x, y oder z ist. |
| \d | Stimmt mit jeder Ziffer überein (entspricht der Klasse [0-9]). Umgekehrt bedeutet das großgeschriebene \D: "jedes Zeichen, dass keine Ziffer ist". Dieser und die anderen zwei Buchstaben können in einer Klasse verwendet werden, zum Beispiel bedeutet [\d.-]: "jede Ziffer, jeder Punkt oder jedes Minuszeichen". |
| \s | Stimmt mit jedem unsichtbaren Zeichen überein, vorwiegend Leerzeichen, Tabulatoren und Zeilenumbrüche (`r und `n). Umgekehrt bedeutet das großgeschriebene \S: "jedes Zeichen, dass nicht unsichtbar ist". |
| \w | Stimmt mit jedem "Wort"-Zeichen überein, nämlich alphanumerisch oder Unterstrich. Das ist gleichbedeutend mit [a-zA-Z0-9_]. Umgekehrt bedeutet das großgeschriebene \W: "jedes Zeichen, dass kein Wort-Zeichen ist". |
| ^ $ |
Zirkumflex (^) und Dollar-Zeichen ($) werden Anker genannt, weil sie keine Zeichen konsumieren, sondern das Muster an den Anfang oder an das Ende des durchsuchten Strings binden. ^ kann am Anfang eines Musters stehen, damit die Übereinstimmung ganz am Anfang einer Zeile erfolgt. Zum Beispiel stimmt ^abc mit abc123 überein, aber nicht mit 123abc. $ kann am Ende eines Musters stehen, damit die Übereinstimmung ganz am Ende einer Zeile erfolgt. Zum Beispiel stimmt abc$ mit 123abc überein, aber nicht mit abc123. Die beiden Anker können kombiniert werden. Zum Beispiel stimmt ^abc$ nur mit abc überein (d. h. es dürfen sich keine anderen Zeichen davor oder dahinter befinden). Wenn der durchsuchte Text mehrere Zeilen enthält, dann können die Anker mithilfe der "m"-Option für jede Zeile anstelle des ganzen Textes gültig gemacht werden. Zum Beispiel stimmt m)^abc$ mit 123`r`nabc`r`n789 überein. Wenn die "m"-Option nicht vorhanden ist, dann erfolgt keine Übereinstimmung. |
| \b | \B bedeutet "Wortgrenze", dass sich wie ein Anker verhält, weil es keine Zeichen konsumiert. Der Status des aktuellen Zeichens muss ein Wort-Zeichen (\w) sein, um das Gegenteil des vorherigen Zeichens zu sein. Es wird normalerweise verwendet, um eine versehentliche Übereinstimmung mit einem Wort zu vermeiden, dass sich in einem anderen Wort befindet. Zum Beispiel stimmt \bcat\b nicht mit catfish überein, aber es stimmt mit cat überein, egal ob es von Interpunktionen oder unsichtbare Zeichen umgeben ist. Großgeschriebenes \B bewirkt das Gegenteil: das aktuelle Zeichen darf sich nicht an einer Wortgrenze befinden. |
| | | Mit dem vertikalen Strich werden mehrere Alternativen abgegrenzt. Eine Übereinstimmung erfolgt, wenn eine beliebige Alternative zufrieden gestellt ist. Zum Beispiel stimmt gray|grey sowohl mit gray als auch grey überein. Ebenso bewirkt gr(a|e)y mithilfe der unten genannten Klammern das Gleiche. |
| (...) | Elemente in Klammern werden häufig verwendet, um:
|
| \t \r usw. |
Diese Schutzsequenzen sind Sonderzeichen. \t (Tabulator), \r (CR-Zeichen) und \n (LF-Zeichen) werden am häufigsten verwendet. In solchen Fällen kann optional ein Akzent (`) anstelle des Backslashs verwendet werden. Schutzsequenzen in Form von \xhh werden ebenfalls unterstützt, wobei hh der Hex-Code eines ANSI-Zeichensatzes zwischen 00 und FF ist. Seit v1.0.46.06 bedeutet \R: "jeder Zeilenumbruch beliebiger Art", die in der `a-Option aufgelistet sind (in einer Zeichenklasse allerdings ist \R lediglich ein normales "R"). Seit v1.0.47.05 kann \R mit (*BSR_ANYCRLF) am Anfang eines Musters (nach den Optionen) auf CR, LF und CRLF beschränkt werden, zum Beispiel: im)(*BSR_ANYCRLF)abc\Rxyz |
| \p{xx} \P{xx} \X |
[AHK_L 61+]: Eigenschaften von Unicode-Zeichen. Wird nicht von den ANSI-Versionen unterstützt. \p{xx} stimmt mit einem Zeichen anhand der xx-Eigenschaft überein, während \P{xx} mit einem beliebigen Zeichen ohne die xx-Eigenschaft übereinstimmt. Zum Beispiel stimmt \pL mit einem beliebigen Buchstaben überein und \p{Lu} mit einem großgeschriebenen Buchstaben. \X stimmt mit einer beliebigen Anzahl an Zeichen überein, die eine erweiterte Unicode-Sequenz formen. Für eine vollständige Namensliste von unterstützten Eigenschaften und andere Details sucht nach "\p{xx}" in www.pcre.org/pcre.txt. |
| (*UCP) | [AHK_L 61+]: Aus Performance-Gründen erkennen \d, \D, \s, \S, \w, \W, \b und \B standardmäßig nur ASCII-Zeichen, auch in Unicode-Versionen. Wenn das Muster mit (*UCP) beginnt, dann werden die Unicode-Eigenschaften verwendet, um festzustellen, welche Zeichen übereinstimmen. Zum Beispiel wird \w gleichbedeutend mit [\p{L}\p{N}_] und \d wird gleichbedeutend mit \p{Nd}. |
Greed (Gier): Standardmäßig sind *, ?, + und {min,max} gierig, weil sie alle Zeichen bis zum letztmöglichen Zeichen konsumieren, die das ganze Muster zufriedenstellen. Damit das Konsumieren beim erstmöglichen Zeichen endet, fügt nach den Quantoren ein Fragezeichen an. Zum Beispiel hat das Muster <.+> (ohne Fragezeichen) die folgende Bedeutung: suche nach einem <, gefolgt von einem oder mehren Zeichen, gefolgt von einem >. Um das Muster daran zu hindern, mit dem ganzen String <em>text</em> übereinzustimmen, fügt nach dem Pluszeichen ein Fragezeichen an: <.+?>. Dadurch stoppt die Übereinstimmung beim ersten '>' und stimmt daher nur mit dem ersten Tag <em> überein.
Vorausschauende und zurückschauende Behauptungen: Die Gruppen (?=...), (?!...), (?<=...) und (?<!...) werden Behauptungen genannt, weil sie darauf bestehen, dass eine Bedingung eintrifft, ohne dabei beliebige Zeichen zu konsumieren. Zum Beispiel ist abc(?=.*xyz) eine vorausschauende Behauptung, weil der String xyz sich irgendwo auf der rechten Seite des Strings abc befinden muss (ist das nicht der Fall, dann erfolgt keine Übereinstimmung). Mit (?=...) wird positiv vorausgeschaut, weil das angegebene Muster vorhanden sein muss. Im Gegenzug wird mit (?!...) negativ vorausgeschaut, weil das angegebene Muster nicht vorhanden sein darf. Ebenso wird mit (?<=...) und (?<!...) positiv bzw. negativ zurückgeschaut, weil sie auf der linken anstelle der rechten Seite nachschauen. Zurückschauende Behauptungen haben mehr Einschränkungen als vorausschauende Behauptungen, weil sie keine Quantoren mit verändernder Größe wie *, ? und + unterstützen. Die Schutzsequenz \K ist mit einer zurückschauenden Behauptung vergleichbar, weil sie alle zuletzt übereinstimmende Zeichen vom Endergebnis weglässt. Zum Beispiel stimmt foo\Kbar mit "foobar" überein, aber mit der Meldung, dass es eine Übereinstimmung mit "bar" hat.
Verwandte Befehle: Reguläre Ausdrücke werden von RegExMatch(), RegExReplace() und SetTitleMatchMode unterstützt.
Schlussbemerkung: Obwohl diese Seite häufig verwendete RegEx-Funktionen anreißt, existieren noch weitere Funktionen, die untersucht werden können, wie z. B. bedingte Teilmuster. Das komplette Handbuch über PCRE kann auf www.pcre.org/pcre.txt gefunden werden.