Formularvalidierung
Mobilnummer, Postleitzahl, Datumsformat, Passwortstärke – die drei Muster aus den Lektionen 22–24 kannst du direkt ins Frontend übernehmen; denk an die Anker und lass semantische Prüfungen wie „30. Februar“ im Code.
Guide
Der Regex-Kurs ist ein interaktives Tutorial mit 25 Lektionen: Jede Lektion gibt dir einen Testtext und ein Ziel („diese hier matchen, diese nicht“ oder „einen bestimmten Teil herausfangen“), du änderst den Ausdruck im Eingabefeld, rechts werden alle Treffer und Gruppen live hervorgehoben, und die Prüfung sagt dir Punkt für Punkt, welche Ziele schon erreicht sind. Alle Prüfungen laufen mit der JavaScript-Regex-Engine des Browsers, kein Text wird hochgeladen.
Aktualisiert am 2026-09-094 sources11 min read
Der Regex-Kurs ist ein interaktives Tutorial mit 25 Lektionen: Jede Lektion gibt dir einen Testtext und ein Ziel („diese hier matchen, diese nicht“ oder „einen bestimmten Teil herausfangen“), du änderst den Ausdruck im Eingabefeld, rechts werden alle Treffer und Gruppen live hervorgehoben, und die Prüfung sagt dir Punkt für Punkt, welche Ziele schon erreicht sind. Alle Prüfungen laufen mit der JavaScript-Regex-Engine des Browsers, kein Text wird hochgeladen.
Der Kurs steigert sich: zuerst die Grundlagen des „Zeichenfindens“ mit Literalen, Punkt und Escape; dann Zeichenklassen und Bereiche, die vordefinierten Klassen \d \w \s und die vier Quantoren; danach Anker und Wortgrenzen, Alternativen, drei Arten von Gruppen mit Backreferences sowie gieriges und faules Matching; weiter zu Lookahead- und Lookbehind-Assertions und Flags; zum Schluss drei echte Muster (Mobilnummern aus Festlandchina, E-Mail, Datum) als Gesamtübung und eine Lektion „katastrophales Backtracking“, in der du selbst einen Ausdruck schreibst, der die Engine blockiert – und ihn dann reparierst.
Etwa 60 Minuten bis zum Durcharbeiten. Für alle, die noch nie einen regulären Ausdruck geschrieben haben oder „abschreiben, aber nicht anpassen“ können; wer Regex schon kennt, springt direkt zu den Lektionen ab 17 mit Lookaround und Fallen.
?lesson=n, der direkt in dieser Lektion öffnet. „Fortschritt zurücksetzen“ löscht alle Einträge dieses Kurses.Der Kurs selbst steht oben auf dieser Seite: links das Inhaltsverzeichnis, in der Mitte der Ausdruck, die Prüfung erscheint sofort.
Lektion 14 „Capture-Gruppe“ soll aus 2026-09-09 das Jahr herausziehen. Hier ein Durchlauf:
Testtext Veröffentlichung: 2026-09-09, Frist: 2027-01-31
Versuch 1 \d+
Treffer 2026 09 09 2027 01 31 ← 6 Treffer, keine Capture-Gruppe
Prüfung ✕ nur zwei vollständige Daten ✕ Gruppe 1 sollte das Jahr sein
Versuch 2 (\d{4})-\d{2}-\d{2}
Treffer 2026-09-09 2027-01-31 ← 2 Treffer
Gruppe 1 2026 2027
Prüfung ✓ Trefferzahl 2 ✓ Gruppe 1 = 2026 / 2027 → bestanden
Lektion 25 „Katastrophales Backtracking“ dreht es um: Zuerst schreibst du ein Muster mit verschachtelten Quantoren wie ^(a+)+$, testest es gegen eine Folge aaaaaaaaaaaaaaaaaaaaaaaaaaaa!, und die Seite meldet exponentiell steigende Versuche; dann sollst du es in die äquivalente Form ^a+$ bringen, um zu bestehen.
Ein regulärer Ausdruck (regular expression) beschreibt mit einem kleinen Symbolvorrat, wie eine Klasse von Zeichenketten aussieht. Buchstaben und Ziffern stehen meist für sich selbst, ein gutes Dutzend Metazeichen (. * + ? ^ $ | ( ) [ ] { } \) hat Sonderbedeutung. Die Engine liest das Muster von links nach rechts über den Text, versucht an jeder Position zu matchen und meldet gefundene Stelle und Länge. Dieser Kurs verwendet den JavaScript-Dialekt (ECMAScript), der sich mit Python, Java und Go in der Grundsyntax fast deckt; die Unterschiede liegen bei Lookaround, Unicode-Eigenschaften und einigen Flags.
cat matcht die drei aufeinanderfolgenden Zeichen c, a, t. Der Punkt . matcht genau ein beliebiges Zeichen außer Zeilenumbrüchen, deshalb matcht c.t auch cat, cut oder c9t. Willst du wirklich einen Punkt finden (etwa den vor einer Dateiendung), schreibst du \. – der Backslash gibt dem Metazeichen seine wörtliche Bedeutung zurück. Alle Metazeichen lassen sich so escapen; innerhalb einer Zeichenklasse müssen nur ] \ ^ - escaped werden.
Eckige Klammern listen Kandidatenzeichen: [aeiou] matcht jeden Vokal; [a-z] und [0-9] nutzen den Bindestrich für Bereiche und lassen sich zu [A-Za-z0-9_] kombinieren; ein ^ am Anfang negiert, [^0-9] matcht jedes Nicht-Ziffer-Zeichen. Drei häufige vordefinierte Klassen sind Kurzschriften dafür:
| Klasse | Entspricht | Bedeutung |
|---|---|---|
\d |
[0-9] |
Ziffern (ohne chinesische Zahlzeichen und Vollbreitenziffern) |
\w |
[A-Za-z0-9_] |
„Wortzeichen“; chinesische Schriftzeichen zählen nicht dazu |
\s |
[ \t\n\r\f\v…] |
Leerraum, inklusive vollbreitem Leerzeichen |
Die großgeschriebenen Varianten \D \W \S sind die jeweilige Negation. Dass \w keine chinesischen Schriftzeichen enthält, ist die Falle, in die Nutzer mit chinesischen Texten am häufigsten tappen: Für chinesische Zeichen schreibst du [\u4e00-\u9fa5] oder mit dem u-Flag \p{Script=Han}.
Ein Quantor steht hinter einem Atom (einzelnes Zeichen, Zeichenklasse oder Gruppe) und legt fest, wie oft es wiederholt wird:
* null- oder mehrfach, + ein- oder mehrfach, ? null- oder einmal;{n} genau n-mal, {n,} mindestens n-mal, {n,m} von n bis m mal.\d{4} liest sich besser als \d\d\d\d, und \d{11} ist die Stellenlänge einer Mobilnummer. Ein Quantor wirkt nur auf das unmittelbar davorstehende Atom: ab+ bedeutet a gefolgt von einem oder mehreren b; um das ganze ab zu wiederholen, brauchst du (ab)+.
^ und $ matchen keine Zeichen, sondern Positionen: Anfang und Ende der Zeichenkette (im Mehrzeilenmodus Anfang und Ende jeder Zeile). Formularvalidierung sollte fast immer ^…$ schreiben, sonst „matcht“ \d{11} auch die ersten 11 Ziffern einer 12-stelligen Nummer. \b ist eine Wortgrenze – die Position zwischen \w und \W (oder zwischen Zeichenkette und Rand). \bcat\b matcht a cat, aber nicht concatenate. Und weil \w keine chinesischen Zeichen umfasst, ist \b in chinesischem Text praktisch nutzlos.
| bedeutet „oder“ und hat die niedrigste Bindung: cat|dog matcht eines der beiden Wörter; zum Eingrenzen brauchst du Klammern, gr(a|e)y. Klammern erzeugen zugleich eine Capture-Gruppe: Nach einem Treffer kannst du den Inhalt über die Nummer holen (match[1]) oder in der Ersetzung mit $1 darauf verweisen – einer der produktivsten Einsätze von Regex; 2026-09-09 in 09/09/2026 zu verwandeln gelingt mit einem einzigen replace.
(?<year>\d{4}) ist eine benannte Gruppe, gelesen über groups.year, und verrutscht beim Umbauen des Musters weniger leicht als Zahlen. (?:…) ist eine nicht erfassende Gruppe: Sie gruppiert nur und belegt keine Nummer, gut geeignet, um Quantoren oder Alternativen zu begrenzen. \1 ist eine Backreference – hier muss erneut stehen, was Gruppe 1 erfasst hat: (\w)\1 matcht Doppelbuchstaben wie ll oder oo, <(\w+)>.*?</\1> matcht zusammengehörige HTML-Tags.
Quantoren sind standardmäßig gierig: so viel wie möglich nehmen und bei Bedarf zurückgeben. Auf "a" and "b" matcht ".+" in einem Zug alles vom ersten bis zum letzten Anführungszeichen. Ein ? hinter dem Quantor macht ihn faul: ".+?" nimmt so wenig wie möglich und liefert zwei Treffer, "a" und "b". Eine genauere Schreibweise ist die negierte Zeichenklasse "[^"]+", die nicht auf Backtracking angewiesen und meist schneller ist.
Lookaround („Umsehen“) matcht wie ein Anker nur eine Position, aber mit der Bedingung „steht daneben ein bestimmtes Muster?“:
(?=…) Lookahead: dahinter muss … folgen; \d+(?=px) matcht die 100 in 100px, ohne „px“ in den Treffer einzubeziehen.(?!…) negativer Lookahead: dahinter darf nicht … folgen.(?<=…) Lookbehind: davor muss … stehen; (?<=¥)\d+ matcht den Preis ohne das Währungszeichen.(?<!…) negativer Lookbehind.JavaScript unterstützt Lookbehind seit ES2018, in Safari erst ab 16.4 vollständig; Pythons Lookbehind verlangt feste Länge. Passwortstärke zu prüfen ist der typische Lookaround-Fall: ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}$ prüft mit drei Lookaheads von derselben Position aus „enthält Ziffer, enthält Kleinbuchstabe, enthält Großbuchstabe“ und verbraucht dann mit .{8,} die ganze Kette.
Flags stehen außerhalb des Musters: i ignoriert Groß-/Kleinschreibung; g findet alle Treffer statt nur den ersten (die Hervorhebung im Kurs nutzt immer g); m lässt ^ $ jede Zeile matchen; s lässt . auch Zeilenumbrüche matchen; u aktiviert den Unicode-Modus, . matcht nach Codepoints statt UTF-16-Codeeinheiten, und ein Emoji zählt als ein Zeichen; y ist Sticky-Matching: ab lastIndex muss sofort ein Treffer stehen.
Mobilnummern aus Festlandchina: ^1[3-9]\d{9}$ – beginnt mit 1, zweite Stelle 3–9, insgesamt 11 Stellen. Versuche nicht, die Nummernkreise der Anbieter aufzuzählen; sie wachsen jedes Jahr.
E-Mail: Ein vollständig RFC-5322-konformer Ausdruck ist Tausende Zeichen lang und wenig praktisch. Vernünftig im Formular ist ^[^\s@]+@[^\s@]+\.[^\s@]+$: genau ein @, beide Seiten nicht leer, die Domain enthält mindestens einen Punkt. Die echte Prüfung ist eine Bestätigungsmail.
Datum: ^(\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$ grenzt Monat auf 01–12 und Tag auf 01–31 ein, weiß aber nicht, wie viele Tage der Februar hat – Syntax prüft der Ausdruck, Semantik der Code.
Die Regex-Engines von JavaScript, Python, Java und PCRE sind Backtracking-Engines: Gibt es mehrere Zerlegungsmöglichkeiten, probiert die Engine eine, und bei Misserfolg geht sie zurück und probiert die nächste. Verschachtelte Quantoren lassen die Zahl der Möglichkeiten exponentiell wachsen: ^(a+)+$ muss bei 30 mal a plus einem ! über 2^30 Zerlegungen durchprobieren, bevor es aufgibt, und der Browser-Tab hängt Sekunden bis Minuten. Nimmt ein solches Muster Nutzereingaben entgegen, ist es ein Denial-of-Service-Angriff (ReDoS).
Was dagegen hilft: zwei benachbarte Quantoren dürfen nicht dieselben Zeichen matchen können ((a+)+, (\w+\s?)+ und (.*)* sind Warnsignale); statt fauler .*? negierte Zeichenklassen verwenden; eine Längenbegrenzung für die Eingabe setzen. Die Regex-Bibliotheken von Go und Rust nutzen Thompson-NFA-/DFA-Verfahren und garantieren lineare Laufzeit, erkaufen das aber mit fehlenden Backreferences und fehlendem Lookaround – Russ Cox' Artikel erklärt den Unterschied am klarsten.
Verschachtelte Strukturen matchen (Klammerpaare, vollständiges HTML), Aufgaben mit „Zählen“ (ob links und rechts gleich viele Klammern stehen) oder kontextabhängige Semantik (ob diese Zahl ein gültiges Datum ist) kann Regex gar nicht oder nur mühsam. Es ist ein Werkzeug der lexikalischen Ebene: Token finden, zerlegen, einfache Validierung, Massenersetzung – darin ist es unschlagbar.
(?i), Pythons (?P<name>), Javas \p{javaLowerCase} und andere Dialektunterschiede kommen nicht vor, ebenso wenig POSIX-Zeichenklassen [[:alpha:]].u wird nur in der Flag-Lektion kurz vorgestellt; \p{…}-Eigenschafts-Escapes und die Mengenoperationen des v-Flags liegen außerhalb des Kurses.\w matcht chinesische Schriftzeichen“: Nein. \w enthält nur ASCII-Buchstaben, Ziffern und den Unterstrich; für chinesische Zeichen [\u4e00-\u9fa5] oder \p{Script=Han} (braucht das u-Flag).. matcht jedes Zeichen“: Standardmäßig keine Zeilenumbrüche; für zeilenübergreifend das s-Flag oder [\s\S] verwenden.\d{11} akzeptiert nur 11 Stellen“: Ohne Anker findet es in einer längeren Ziffernfolge ein 11-stelliges Stück; Validierung braucht immer ^…$.[A-z] sind alle Buchstaben“: In ASCII liegen zwischen großem Z (90) und kleinem a (97) noch [ \ ] ^ _ \`` – sechs Zeichen, die mitgematcht werden; richtig ist [A-Za-z]`.ab+ wiederholt nur b; ab{2} matcht abb, nicht abab.> in Attributen und Kommentare bringen Regex zu Fall – nimm einen DOM-Parser.Mobilnummer, Postleitzahl, Datumsformat, Passwortstärke – die drei Muster aus den Lektionen 22–24 kannst du direkt ins Frontend übernehmen; denk an die Anker und lass semantische Prüfungen wie „30. Februar“ im Code.
Die Suchen-und-Ersetzen-Funktionen von VS Code, Sublime und den JetBrains-IDEs unterstützen Regex und $1-Verweise. Nach der Gruppen-Lektion änderst du alle 2026-09-09 in einem Zug zu 09/09/2026 oder setzt vor jedes console.log( ein Präfix.
IPs, Statuscodes und Laufzeiten aus Zehntausenden Logzeilen ziehen: Muster wie (\d+\.\d+\.\d+\.\d+).*?" (\d{3}) (\d+)ms mit benannten Gruppen liefern mit wenigen Skriptzeilen eine Statistik.
Findest du verschachtelte oder überlappende Quantoren wie (\w+\s?)+$, (.*a)+ oder (a|aa)+ an einer Stelle, die Nutzereingaben verarbeitet, gehört das umgeschrieben oder mit einem Längenlimit versehen.
Die Prüfung schaut auf das Ergebnis, nicht auf die Schreibweise: Wenn alles Treffen soll, trifft, alles nicht Treffen soll, leer ausgeht und die Capture-Gruppen übereinstimmen, ist die Lektion bestanden. Die Referenzlösung ist nur eine Möglichkeit.
Meist wurde auch ein Ausschnitt gematcht, der nicht treffen soll, oder der Treffer reicht ein Zeichen weiter als beabsichtigt (etwa ein Satzzeichen mitgenommen). Schau in der Ergebnisleiste, welcher Punkt ein ✕ hat.
Die Syntax der Lektionen 1–18 ist in den gängigen Sprachen vollständig übertragbar. Lookbehind verlangt in Python feste Länge, die benannte Gruppe schreibt sich dort (?P<name>…); Flags werden je Sprache anders geschrieben.
Im localStorage des aktuellen Browsers, ohne Übertragung. Beim Browserwechsel oder Löschen der Seitendaten ist er weg; über den Link von „Diese Lektion teilen“ kannst du dir die zuletzt erreichte Lektion merken.
Die Demo zählt simuliert Schritte und wertet ab dem Schwellenwert als „katastrophales Backtracking“. Eine echte Ausführung würde den Tab nicht mehr reagieren lassen und könnte dir keine Rückmeldung geben.
Der Kurs läuft vollständig lokal im Browser: Dein Ausdruck und der Testtext gehen nur an die im Browser eingebaute Regex-Engine, nichts wird an einen Server gesendet; der Fortschritt liegt im lokalen localStorage, und beim Schließen der Seite werden die Eingaben freigegeben.
Aktualisiert am 2026-09-09
Interaktiver Lehrgang über 25 Stationen: Literale, Zeichenklassen, Quantoren, Gruppen und Lookaround bis zu Backtracking-Fallen; Änderungen wirken sofort auf die Treffer
Dieses Werkzeug ist noch nicht vollständig übersetzt; einige Inhalte nutzen die Ausgangssprache oder die Rückfallsprache.
ZielSchreiben Sie einen Ausdruck, der mit jedem Wort übereinstimmt, das cat enthält, und mit nichts anderem.
Der einfachste reguläre Ausdruck ist eine Folge gewöhnlicher Zeichen: cat durchsucht den Text nach einem aufeinanderfolgenden c, a, t. Standardmäßig bedeutet ein regulärer Ausdruck „enthält“, nicht „gleich“ – concat und category enthalten cat, also stimmen sie auch überein. Buchstaben, Ziffern, Leerzeichen und CJK-Zeichen sind alle Literale; Nur etwa ein Dutzend Symbole sind besonders und werden in den nächsten Lektionen einzeln behandelt.