Regex-Muster sind wiederverwendbare Vorlagen, die bestimmte Zeichenfolgen in einem Text erkennen - stell sie dir wie ein extrem leistungsstarkes "Suchen"-Werkzeug vor, das in fast jeder Programmiersprache funktioniert. Ob du eine E-Mail-Adresse validierst, eine Telefonnummer aus einem Formular extrahierst oder eine Log-Datei analysierst: Mit einer Handvoll gut gewählter regulärer Ausdrücke lassen sich 90 % der alltäglichen Aufgaben lösen. Dieser Leitfaden versammelt die praktischsten Muster, erklärt genau, was jedes davon tut, und zeigt dir, wie du sie anpassen kannst.
Inhaltsverzeichnis
Schnelle Regex-Syntax-Übersicht
Bevor wir in die Muster einsteigen, hier ein Spickzettel mit den Grundbausteinen, die dir immer wieder begegnen werden. Selbst wenn du schon Erfahrung mit Regex hast, ist es praktisch, alles auf einen Blick zu haben.
| Token | Bedeutung | Beispiel-Treffer |
|---|---|---|
.
|
Beliebiges Zeichen außer Zeilenumbruch |
a.c
trifft
abc
,
a1c
|
\d
|
Beliebige Ziffer (0-9) |
\d\d
trifft
42
|
\w
|
Wortzeichen (Buchstaben, Ziffern, Unterstrich) |
\w+
trifft
hello_world
|
\s
|
Whitespace (Leerzeichen, Tab, Zeilenumbruch) |
\s+
trifft mehrere Leerzeichen
|
^
/
$
|
Anfang / Ende des Strings |
^\d+$
trifft nur
123
|
{n,m}
|
Zwischen n und m Wiederholungen |
\d{2,4}
trifft
12
bis
1234
|
[abc]
|
Zeichenklasse - eines von a, b, c |
[aeiou]
trifft jeden Vokal
|
(?:...)
|
Nicht-einfangende Gruppe (non-capturing group) | Gruppiert ohne Backreference zu speichern |
(?=...)
|
Positiver Lookahead | Prüft, was folgt, ohne es zu konsumieren |
Der MDN Web Docs-Leitfaden zu regulären Ausdrücken ist die beste einzelne Referenz für JavaScript-Regex-Syntax. Die meisten der folgenden Muster lassen sich mit kleinen Flag-Unterschieden direkt auf Python, PHP, Java und Ruby übertragen.
E-Mail-Validierung
E-Mail ist der klassische Regex-Anwendungsfall - und gleichzeitig der, bei dem die meisten Entwickler scheitern, weil sie zu streng vorgehen. Die
RFC 5322-Spezifikation
erlaubt technisch gesehen Adressen wie
"very unusual"@example.com
, die kaum ein Regex-Muster korrekt verarbeitet. Für 99 % der realen Eingabevalidierung reicht ein pragmatisches Muster völlig aus:
^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}$
Was die einzelnen Teile bedeuten:
-
[a-zA-Z0-9._%+\-]+- lokaler Teil (vor dem @); erlaubt Punkte, Pluszeichen, Bindestriche, Unterstriche -
@- das @-Zeichen selbst -
[a-zA-Z0-9.\-]+- Domainname einschließlich Subdomains -
\.[a-zA-Z]{2,}- TLD mit mindestens 2 Zeichen (.io, .com, .museum)
URLs und Webadressen
Pattern Matching für URLs deckt alles ab - vom Extrahieren von Links aus Plaintext bis hin zur Validierung eines vom Nutzer eingegebenen Website-Felds.
https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_+.~#?&\/=]*)
-
https?- trifft sowohlhttpals auchhttps -
(?:www\.)?- optionales www-Präfix -
[-a-zA-Z0-9@:%._+~#=]{1,256}- Hostname-Zeichen, bis zu 256 Zeichen -
\.[a-zA-Z0-9()]{1,6}- TLD -
\b(?:[-a-zA-Z0-9()@:%_+.~#?&\/=]*)- optionaler Pfad, Query-String und Fragment
Wenn du nur validieren (nicht extrahieren) möchtest, umschließe das Muster mit den Ankern
^
und
$
.
Telefonnummern
Telefonnummern sind notorisch uneinheitlich, weil die Formatierung je nach Land und Nutzergewohnheit stark variiert. Zwei Muster decken die meisten Szenarien ab:
US/Kanada (NANP)-Format
^(\+1[-.\s]?)?(\(?\d{3}\)?[-.\s]?)?\d{3}[-.\s]?\d{4}$
Trifft:
555-867-5309
,
(555) 867 5309
,
+1.555.867.5309
,
5558675309
International (E.164-Format)
^\+[1-9]\d{6,14}$
E.164 ist das Format, das von den meisten Telefonie-APIs (Twilio, AWS SNS) verwendet wird. Es beginnt mit einem
+
und einer Ländervorwahl, ohne Leerzeichen oder Sonderzeichen.
Datums- und Zeitformate
Pattern Matching für Datumswerte ist in Log-Parsern, Formularvalidierungen und Datenpipelines allgegenwärtig. Welches Format du anvisierst, hängt von deiner Eingabequelle ab.
ISO 8601 (YYYY-MM-DD)
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
US-Format (MM/DD/YYYY)
^(0[1-9]|1[0-2])\/(0[1-9]|[12]\d|3[01])\/\d{4}$
24-Stunden-Zeit (HH:MM oder HH:MM:SS)
^([01]\d|2[0-3]):([0-5]\d)(?::([0-5]\d))?$
Beachte, dass diese Muster nur das Format validieren, nicht die Kalenderlogik. Sie akzeptieren zum Beispiel
2024-02-31
(den 31. Februar gibt es nicht). Für eine strikte Datumsvalidierung solltest du den Wert nach der Regex-Prüfung mit der Datumsbibliothek deiner Sprache parsen.
Passwortstärke validieren
Passwortregeln erfordern typischerweise eine Mischung aus verschiedenen Zeichentypen und eine Mindestlänge. Lookaheads machen das elegant, ohne mehrere separate Prüfungen zu benötigen.
Mindestens 8 Zeichen, davon ein Großbuchstabe, ein Kleinbuchstabe, eine Ziffer
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$
Stark: 8+ Zeichen, Groß- und Kleinbuchstaben, Ziffer und Sonderzeichen
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]).{8,}$
Jedes
(?=.*[...])
ist ein Lookahead, der den gesamten String nach mindestens einem passenden Zeichen durchsucht. Das abschließende
.{8,}
erzwingt die Mindestlänge. Du kannst
{8,}
durch
{12,}
ersetzen, um ein 12-Zeichen-Minimum durchzusetzen - das entspricht den
NIST SP 800-63B-Richtlinien
.
IP-Adressen
IPv4
^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$
Dieses Muster lehnt Werte wie
999.0.0.1
korrekt ab, indem es jedes Oktett explizit als 0-255 prüft.
IPv6 (vereinfacht)
^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$
Dieses Muster verarbeitet das vollständige 8-Gruppen-Format. Für die Kurzschreibweise (z. B.
::1
für Loopback) wird das Muster erheblich komplexer - an diesem Punkt ist das Parsen mit einer Netzwerkbibliothek zuverlässiger als Regex.
HTML und Markup
Einige gezielte Muster sind hier durchaus nützlich. Der allgemeine Ratschlag "HTML nicht mit Regex parsen" gilt nach wie vor für vollständige Dokumente - verwende dafür einen richtigen DOM-Parser wie BeautifulSoup oder DOMParser. Für spezifische, klar abgegrenzte Aufgaben funktioniert Regex jedoch problemlos.
Alle HTML-Tags entfernen
<[^>]*>
Inhalt eines bestimmten Tags extrahieren (z. B. <title>)
([^<]*)<\/title>
Capture-Gruppe 1 enthält den Title-Text.
HTML-Hex-Farbcodes erkennen
#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})\b
Trifft sowohl die 3-stellige Kurzform (
#fff
) als auch die 6-stellige Vollform (
#ffffff
).
Nützliche Allzweck-Muster
Diese Muster tauchen in den unterschiedlichsten Projekten immer wieder auf.
Slug (URL-freundlicher String)
^[a-z0-9]+(?:-[a-z0-9]+)*$
Trifft Strings wie
my-blog-post-2024
. Keine Großbuchstaben, keine führenden oder abschließenden Bindestriche, keine doppelten Bindestriche.
Kreditkartennummer (Basisformat, ohne Leerzeichen)
^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|6(?:011|5[0-9]{2})[0-9]{12})$
-
Beginnt mit
4- Visa (13 oder 16 Stellen) -
Beginnt mit
51-55- Mastercard (16 Stellen) -
Beginnt mit
34oder37- Amex (15 Stellen) -
Beginnt mit
6011oder65- Discover (16 Stellen)
Whitespace normalisieren (mehrere Leerzeichen zusammenfassen)
\s{2,}
Ersetze Treffer durch ein einzelnes Leerzeichen, um unordentliche Nutzereingaben oder gescrapte Texte zu bereinigen.
Nur Ziffern
^\d+$
Nur alphanumerische Zeichen
^[a-zA-Z0-9]+$
Zeile erkennen, die ein bestimmtes Wort enthält (Groß-/Kleinschreibung ignorieren mit Flag)
^.*\bword\b.*$
Die Wortgrenze
\b
verhindert, dass
word
innerhalb von
password
als Treffer gewertet wird.
Versionsnummern extrahieren (semver)
\bv?(\d+)\.(\d+)\.(\d+)(?:-([a-zA-Z0-9.]+))?(?:\+([a-zA-Z0-9.]+))?\b
Erfasst Major-, Minor-, Patch-Version, Pre-Release-Label und Build-Metadaten aus Strings wie
v2.14.0-beta.1+build.42
.
Flags und praktische Tipps
Regex-Muster verhalten sich je nach verwendeten Flags unterschiedlich. Die am häufigsten benötigten:
| Flag | JS | Python | Wirkung |
|---|---|---|---|
| Groß-/Kleinschreibung ignorieren |
i
|
re.IGNORECASE
|
Behandelt Groß- und Kleinbuchstaben als gleich |
| Global (alle Treffer) |
g
|
re.findall()
|
Gibt alle Treffer zurück, nicht nur den ersten |
| Multiline |
m
|
re.MULTILINE
|
^
und
$
beziehen sich auf Zeilengrenzen, nicht auf String-Grenzen
|
| Dotall |
s
|
re.DOTALL
|
.
trifft auch Zeilenumbrüche
|
Ein paar Gewohnheiten, die dir beim Debuggen viel Zeit sparen:
- Teste immer mit Grenzfällen - leerer String, maximale Länge, Unicode-Zeichen und Strings, die fast, aber nicht ganz gültig sind.
-
Verwende non-capturing groups
(?:...)wenn du den gematchten Inhalt nicht benötigst - das ist schneller und sauberer als normale Capture-Gruppen. -
Verankere deine Validierungsmuster
mit
^und$, damit ein gültig aussehender Teilstring innerhalb eines ungültigen Strings nicht durchrutscht. -
Vorsicht vor katastrophalem Backtracking
- verschachtelte Quantifizierer wie
(a+)+können dazu führen, dass Regex-Engines bei gezielt konstruierter Eingabe hängen bleiben. Halte Quantifizierer einfach und spezifisch. - Nutze einen Regex-Tester beim Entwickeln von Mustern. regex101.com zeigt eine Live-Trefferanalyse, erklärt jeden Token und lässt dich zwischen PCRE, JavaScript, Python und anderen Varianten wechseln.
Regex-Muster testen und validieren - ohne Rätselraten
Zuverlässige Regex-Muster für die Eingabevalidierung entwickelst du schneller, wenn du die richtigen Werkzeuge zur Hand hast. Entdecke unsere kostenlosen Entwickler-Utilities zum Bereinigen, Prüfen und Transformieren von Text mit Regex-Mustern und mehr.
Jetzt kostenlos ausprobieren →
Gierige Quantifizierer (wie
.*
) matchen so viel wie möglich und gehen dann zurück (Backtracking). Faule Quantifizierer (wie
.*?
) matchen so wenig wie möglich. Beim String
bold
trifft das Muster
<.*>
beispielsweise den gesamten String, während
<.*?>
nur
trifft. Verwende faule Quantifizierer, wenn du Inhalte zwischen Trennzeichen extrahierst.
Größtenteils ja, aber es gibt Unterschiede. Pythons
re
-Modul verwendet PCRE-ähnliche Syntax und unterstützt benannte Gruppen mit
(?P
. JavaScript verwendet eine leicht abweichende Flag-Syntax und unterstützt Lookbehinds in älteren Engines (vor ES2018) nicht. Für sprachübergreifende Arbeit empfiehlt sich der gemeinsame Nenner: Zeichenklassen, Quantifizierer, Anker und einfache Gruppen.
Regex ist für die Formatvalidierung in der Produktion absolut geeignet - es wird in nahezu jedem Web-Framework eingesetzt. Die Risiken entstehen durch schlecht geschriebene Muster, die ReDoS-Angriffe (Regex Denial-of-Service) durch katastrophales Backtracking ermöglichen. Vermeide verschachtelte Quantifizierer, halte Muster spezifisch und setze immer eine sinnvolle Längenbegrenzung für die Eingabe, bevor der Regex überhaupt ausgeführt wird.
In den meisten gängigen Engines sind sie für ASCII-Eingaben gleichwertig. Der Unterschied zeigt sich bei Unicode:
\d
trifft in manchen Engines (wie Python 3 im Unicode-Modus) auch Ziffern aus anderen Schriftsystemen, etwa arabisch-indische Ziffern. Wenn du explizit nur die ASCII-Ziffern 0-9 möchtest, verwende
[0-9]
. Für die meisten Web-Formularvalidierungen spielt der Unterschied keine Rolle.
Du benötigst zwei Dinge: das
Dotall-Flag
(damit
.
auch Zeilenumbrüche trifft) und möglicherweise das
Multiline-Flag
(damit
^
und
$
an jede Zeile statt an den gesamten String gebunden sind). In JavaScript verwendest du
/pattern/ms
. In Python kombinierst du
re.DOTALL | re.MULTILINE
. Ohne das Dotall-Flag stoppt
.
bei Zeilenumbrüchen und das Muster überspannt keine Zeilen.