Die Grundlagen in einer Minute
Die meisten Zeichen stehen für sich selbst: Haus findet die Buchstaben H, a, u, s in genau dieser Reihenfolge, überall im Text, auch mitten in Rathaus. Einige Zeichen haben eine besondere Bedeutung: . ^ $ * + ? ( ) [ ] { } | und der Backslash. Willst du eines davon wörtlich finden, setz einen Backslash davor: \. findet einen echten Punkt und \$ ein Dollarzeichen.
Die Beispiele hier nutzen die JavaScript-Syntax, also das, was Browser, Node.js und der Tester auf dieser Seite ausführen. Python, PHP (PCRE), Java und .NET teilen fast alles davon; Unterschiede gibt es vor allem beim Lookbehind, bei der Schreibweise benannter Gruppen und bei ein paar Escapes. Gib ein Muster ohne die umschließenden Schrägstriche unter Regulärer Ausdruck ein, füge deinen Text unter Testtext ein, und jeder Treffer wird markiert.
Hier ausprobieren: Regex-Tester
Vollständige Tool-Seite öffnenZeichen und Zeichenklassen
Eine Zeichenklasse findet genau ein Zeichen aus einer Menge. [aeiou] findet einen Vokal, [a-z] einen ASCII-Kleinbuchstaben, [^0-9] alles, was keine Ziffer ist. Innerhalb eckiger Klammern verlieren die meisten Sonderzeichen ihre Bedeutung, [.?] findet also einen Punkt oder ein Fragezeichen. Einen wörtlichen Bindestrich setzt du an den Anfang oder ans Ende: [-.] oder [.-].
| Muster | Findet | Beispiel |
|---|---|---|
| . | Jedes Zeichen außer einem Zeilenumbruch | M.st findet Mast, Mist, M7st |
| \d | Eine Ziffer von 0 bis 9 | \d\d findet 42 in Raum 42 |
| \w | Buchstabe, Ziffer oder Unterstrich (nur ASCII) | \w+ findet user_01 |
| \s | Leerzeichen, Tab oder Zeilenumbruch | a\sb findet a b |
| \D \W \S | Das Gegenteil von \d, \w und \s | \D findet das x in 4x4 |
| [abc] | Eins von a, b oder c | gr[ae]y findet gray und grey |
| [^abc] | Jedes Zeichen außer a, b oder c | [^,]+ findet den Text zwischen Kommas |
| \p{L} | Jeder Buchstabe in jeder Sprache (Flag u) | \p{L}+ findet café und Straße |
| \b | Wortgrenze (kein Zeichen) | \bHaus\b findet Haus, aber nicht Rathaus |
Quantoren, Anker und Gruppen
Quantoren legen fest, wie oft das Vorherige wiederholt wird. Anker finden eine Position, kein Zeichen. Gruppen fassen Teile eines Musters zusammen, merken sich, was sie gefunden haben, und erlauben eine Auswahl zwischen Alternativen.
| Muster | Bedeutung | Beispiel |
|---|---|---|
| * | 0 oder mehr Mal | ab*c findet ac, abc, abbc |
| + | 1 oder mehr Mal | \d+ findet 7 und 2026 |
| ? | 0 oder 1 Mal (optional) | colou?r findet color und colour |
| {3} | Genau 3 Mal | \d{3} findet 555 |
| {2,4} | Zwischen 2 und 4 Mal | \d{2,4} findet 12, 123, 1234 |
| {2,} | 2 oder mehr Mal | a{2,} findet aa und aaaa |
| *? +? ?? | Genügsam (lazy): so wenig wie möglich | <.+?> findet <b> und </b> getrennt |
| ^ | Anfang des Textes (oder der Zeile mit Flag m) | ^Fehler findet Fehler nur am Anfang |
| $ | Ende des Textes (oder der Zeile mit Flag m) | \.pdf$ findet Namen, die auf .pdf enden |
| (abc) | Erfassende Gruppe, wiederverwendbar als $1 | (\d{4})-(\d{2}) erfasst Jahr und Monat |
| (?:abc) | Gruppe ohne Erfassen | (?:ab)+ findet ababab |
| (?<jahr>\d{4}) | Benannte Gruppe, wiederverwendbar als $<jahr> | Erscheint als jahr in der Gruppentabelle |
| a|b | a oder b | Katze|Hund findet beide Wörter |
| (?=x) (?!x) | Gefolgt von x, nicht gefolgt von x | \d+(?=px) findet 16 in 16px |
| (?<=x) (?<!x) | Davor steht x, davor steht nicht x | (?<=\$)\d+ findet 25 in $25 |
Flags
Flags ändern das Verhalten des ganzen Musters. Im Tester sind es Kästchen neben dem Muster; im JavaScript-Code stehen sie hinter dem schließenden Schrägstrich, etwa /katze/gi.
- g (global): findet alle Treffer, statt nach dem ersten aufzuhören. Nötig für Alle ersetzen.
- i (ignore case): Katze, KATZE und katze passen alle auf katze.
- m (multiline): ^ und $ greifen am Anfang und Ende jeder Zeile, nicht nur des ganzen Textes. Praktisch für Logdateien und Listen.
- s (dotAll): der Punkt findet auch Zeilenumbrüche, damit kann .* über mehrere Zeilen reichen.
- u (Unicode): schaltet \p{L} und andere Eigenschafts-Escapes frei, behandelt Emoji und andere Zeichen außerhalb der Basisebene als ein Zeichen und lehnt unbekannte Escapes ab.
- y (sticky): der Treffer muss genau dort beginnen, wo der vorige endete. Wird vor allem beim Schreiben von Tokenizern genutzt.
Getestete Muster für E-Mail, Telefon und Datum
Diese Muster wurden an gültigen und ungültigen Beispielen geprüft. Setz ^ an den Anfang und $ ans Ende, wenn du ein ganzes Eingabefeld prüfst, und lass beides weg, wenn du in einem längeren Text suchst.
E-Mail: [\w.+-]+@[\w-]+(\.[\w-]+)+ findet ana.lopez+news@mail.example.com und a@b.co und lehnt me@localhost ab, weil es einen Punkt in der Domain verlangt. Das ist das Muster E-Mail unter Gängige Muster im Tester. Keine Regex kann bestätigen, dass eine Adresse wirklich existiert; dafür schickst du eine Bestätigungsmail. Die offizielle Adressgrammatik (RFC 5322) erlaubt Formen, die ein praxistaugliches Muster ohnehin ablehnen sollte. Beachte auch: \w kennt ohne Flag u keine Umlaute, eine Adresse wie jürgen@example.de wird also nicht gefunden.
Telefon, internationales Format E.164: \+[1-9]\d{6,14} findet +14155552671, +34612345678 und eine deutsche Handynummer wie +4915112345678, also das Format, das SMS- und Telefonie-Schnittstellen verwenden (ein Plus, eine Ländervorwahl und insgesamt höchstens 15 Ziffern). Für US-Nummern, wie Menschen sie schreiben, findet \(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4} die Formen (555) 123-4567, 555.123.4567 und 5551234567. Es akzeptiert aber auch eine unvollständige Klammer wie (555 123-4567; entferne deshalb vor dem Speichern alles außer den Ziffern. Um gemischte internationale Nummern in einem Text zu finden, etwa +44 20 7946 0958 oder +1 (555) 123-4567, nimm das Muster Telefon unter Gängige Muster im Tester.
Datum im ISO-Format JJJJ-MM-TT: \d{4}-\d{2}-\d{2} findet alles, was wie ein Datum aussieht. Die strengere Version (19|20)\d{2}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]) lehnt Monat 13 und Tag 00 ab, akzeptiert aber trotzdem 2026-02-31. Eine Regex prüft die Form; ob es den Tag wirklich gibt, prüfst du mit den Datumsfunktionen deiner Programmiersprache.
Datum ins deutsche Format umwandeln: Suche nach (\d{4})-(\d{2})-(\d{2}), schreib $3.$2.$1 in Ersetzen durch, und aus 2026-10-26 wird 26.10.2026.
Typische Fehler und wie du sie behebst
- Punkt nicht maskiert: example.com findet auch exampleXcom. Schreib example\.com.
- Gieriges Matching: <.+> findet in <b>fett</b> den ganzen Text. Nimm das genügsame <.+?> oder eine verneinte Klasse <[^>]+>.
- Fehlende Anker bei der Prüfung: \d{5} akzeptiert abc12345xyz, weil es fünf Ziffern darin findet. Nimm ^\d{5}$, zum Beispiel für eine Postleitzahl.
- Erwarten, dass \w Umlaute findet: Ohne Flag u deckt es nur A-Z, a-z, 0-9 und _ ab, also kein ä, ö, ü oder ß. Nimm \p{L} mit Flag u für Namen in jeder Sprache.
- Flag g vergessen: Ersetzen ändert nur den ersten Treffer, und der Tester zeigt nur einen.
- Verschachtelte Quantoren wie (a+)+ oder (\w+\s?)+$: Bei manchen Eingaben brauchen sie exponentiell viel Zeit, das nennt man katastrophales Backtracking. Der Tester stoppt ein Muster nach 1,5 Sekunden und sagt dir Bescheid; schreib es so um, dass jeder Teil nur auf eine Art passen kann.
- HTML oder JSON mit Regex auslesen: für eine schnelle Suche in Ordnung, für echtes Parsen unzuverlässig. Für alles Verschachtelte nimmst du einen Parser.
Ein Muster Schritt für Schritt aufbauen
Fang mit einem wörtlichen Stück des gesuchten Textes an, zum Beispiel 2026-10-26, und prüf, ob es gefunden wird. Ersetze dann Teile nacheinander durch Klassen: \d{4}-10-26, danach \d{4}-\d{2}-\d{2}. Schau nach jeder Änderung, was im Testtext sonst noch markiert wird, und füge ein paar Zeilen hinzu, die nicht passen dürfen. Ein guter Testtext enthält sowohl die gewünschten Fälle als auch knappe Fehlversuche.
In der Tabelle Treffer siehst du für jeden Treffer die Position und alle erfassenden Gruppen. Erfasst eine Gruppe den falschen Teil, verschieb die Klammern. Wenn das Muster funktioniert, übernimm es unverändert in deinen Code: JavaScript und der Tester nutzen dieselbe Engine, das Ergebnis ist also identisch.