Zum Inhalt springen
LeedyBox
Unterstützen

Grundlagen regulärer Ausdrücke

Ein regulärer Ausdruck (RegEx) ist ein Muster, das Text beschreibt. Diese Anleitung behandelt die Bausteine, die Sie am häufigsten verwenden werden, und die Fallstricke, die zu langsamen oder überraschenden Treffern führen.

Literale und Zeichenklassen

Die meisten Zeichen treffen auf sich selbst zu: Das Muster cat findet den Text „cat“. Einige Zeichen haben eine besondere Bedeutung, etwa . * + ? ( ) [ ] { } ^ $ | \. Um eines davon wörtlich zu finden, maskieren Sie es mit einem Backslash, zum Beispiel \. für einen Punkt.

Eine Zeichenklasse trifft auf ein Zeichen aus einer Menge zu. [abc] trifft auf a, b oder c zu; [a-z] auf einen ASCII-Kleinbuchstaben; [^0-9] auf alles, was keine Ziffer ist. Gängige Kurzformen sind \d (Ziffer), \w (Buchstabe, Ziffer oder Unterstrich), \s (Leerraum) und ihre Gegenstücke \D, \W und \S. Der Punkt . trifft auf jedes Zeichen außer einem Zeilenumbruch zu.

In JavaScript decken \w und \d nur ASCII-Zeichen ab. Um Buchstaben in jeder Sprache zu finden, verwenden Sie eine Unicode-Eigenschaft wie \p{L} mit dem Flag u.

Quantoren und Anker

Quantoren geben an, wie oft sich das vorherige Element wiederholen darf:

Syntax Bedeutung Beispiel
* 0 oder mehr ab* trifft auf a, ab, abbb zu
+ 1 oder mehr \d+ trifft auf 7 oder 2026 zu
? 0 oder 1 colou?r trifft auf color und colour zu
{n,m} Zwischen n und m \d{2,4} trifft auf 2 bis 4 Ziffern zu

Anker treffen auf eine Position statt auf ein Zeichen zu. ^ ist der Anfang und $ das Ende der Eingabe (oder jeder Zeile mit dem Flag m). \b ist eine Wortgrenze, daher findet \bcat\b „cat“, aber nicht „concatenate“. Wenn Sie einen ganzen Wert validieren, verankern Sie beide Enden: ^\d{5}$ akzeptiert genau fünf Ziffern und sonst nichts.

Gruppen und Erfassungen

Klammern gruppieren einen Teil eines Musters, sodass ein Quantor oder eine Alternative darauf angewendet wird: (ab)+ wiederholt „ab“, und (jpg|png) trifft auf eines der beiden Wörter zu. Eine normale Gruppe erfasst außerdem den getroffenen Text, den Sie in einer Ersetzung als $1, $2 usw. wiederverwenden können.

Benannte Gruppen wie (?<year>\d{4}) machen Muster lesbarer und können als $<year> referenziert werden. Wenn Sie nur gruppieren möchten, vermeidet eine nicht erfassende Gruppe (?:...) eine ungenutzte Erfassung. Der LeedyBox-RegEx-Tester listet jeden Treffer mit seinen Gruppen auf und zeigt Ersetzungen vorab.

Flags

Flags ändern das Verhalten des gesamten Musters. Die gängigen JavaScript-Flags sind:

  • g (global): alle Treffer finden statt nur des ersten.
  • i (ignore case): Groß- und Kleinschreibung als gleich behandeln.
  • m (multiline): ^ und $ treffen an jedem Zeilenumbruch.
  • s (dotAll): . trifft auch auf Zeilenumbrüche zu.
  • u (unicode): aktiviert Unicode-fähiges Matching und \p{...}-Klassen.

JavaScript kennt außerdem y (sticky) und d (Trefferindizes), die der Tester ebenfalls unterstützt.

Gierig oder genügsam – und katastrophales Backtracking

Quantoren sind standardmäßig gierig: Sie treffen so viel wie möglich und geben Zeichen wieder ab, wenn der Rest des Musters fehlschlägt. Beim Text <b>bold</b> trifft das Muster <.+> auf die gesamte Zeichenkette zu. Ein angehängtes ? macht den Quantor genügsam, sodass <.+?> nur <b> trifft. Eine negierte Klasse wie <[^>]+> ist oft klarer und schneller.

Die meisten RegEx-Engines, auch die von JavaScript, arbeiten mit Backtracking. Verschachtelte Quantoren wie (a+)+$ oder sich überschneidende Alternativen können die Engine dazu bringen, bei einem fehlschlagenden Treffer eine riesige Zahl von Kombinationen auszuprobieren, was eine Seite oder einen Server einfrieren kann. Das nennt man katastrophales Backtracking, und mit nicht vertrauenswürdigen Eingaben kann es für Denial-of-Service-Angriffe (ReDoS) ausgenutzt werden. Vermeiden Sie verschachtelte Quantoren über dieselben Zeichen, bevorzugen Sie spezifische Klassen gegenüber .* und testen Sie Muster mit langen Eingaben, die nicht passen.

RegEx-Varianten unterscheiden sich

Es gibt keinen einheitlichen RegEx-Standard. JavaScript, Python, Java, .NET, PCRE (von PHP verwendet), Go und Datenbanken unterstützen jeweils eine leicht abweichende Syntax. Lookbehind, possessive Quantoren, die Syntax benannter Gruppen, Unicode-Klassen und die Ersetzungssyntax variieren. Die RE2-Engine von Go unterstützt zum Beispiel weder Lookaround noch Rückverweise.

Der LeedyBox-RegEx-Tester verwendet die JavaScript-Engine Ihres Browsers. Ein Muster, das dort funktioniert, muss in einer anderen Sprache eventuell angepasst werden – testen Sie es daher erneut dort, wo es ausgeführt wird.

Häufige Fragen

Warum findet mein Muster nur das erste Vorkommen?

Ohne das Flag g hört JavaScript nach dem ersten Treffer auf. Aktivieren Sie g, um alle Treffer zu finden.

Kann ein regulärer Ausdruck E-Mail-Adressen validieren?

Ein regulärer Ausdruck kann prüfen, ob ein Wert plausibel aussieht, aber nicht bestätigen, dass eine Adresse existiert. Üblicherweise wird sie durch das Senden einer Bestätigungs-E-Mail verifiziert.

Warum trifft ^ in mehrzeiligem Text nur einmal?

Standardmäßig beziehen sich ^ und $ auf die gesamte Eingabe. Aktivieren Sie das Flag m, damit sie am Anfang und Ende jeder Zeile treffen.