Nützliche Regex-Muster, die du als Entwickler bookmarken solltest

Häufige Regex-Muster-Referenz mit hervorgehobener Musterabgleich-Syntax auf dunklem Editor-Hintergrund

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.

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)
Regex allein kann nicht bestätigen, ob eine E-Mail-Adresse tatsächlich existiert oder zustellbar ist. Sende für alles, was wichtig ist, immer eine Bestätigungs-E-Mail.

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 sowohl http als auch https
  • (?: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.

Für alles, was über eine einfache Formatprüfung hinausgeht - etwa die Verifizierung, ob eine Nummer tatsächlich ein gültiger Mobilanschluss in einem bestimmten Land ist - solltest du eine spezialisierte Bibliothek wie libphonenumber (Googles Open-Source-Bibliothek für Telefonnummern, verfügbar für Java, JavaScript, Python und mehr) verwenden.

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 34 oder 37 - Amex (15 Stellen)
  • Beginnt mit 6011 oder 65 - Discover (16 Stellen)
Speichere niemals rohe Kartennummern. Dieses Muster dient ausschließlich als clientseitiges Format-Feedback. Die eigentliche Kartenvalidierung muss über einen PCI-konformen Zahlungsdienstleister wie Stripe oder Braintree laufen.

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-Pattern-Matching und Eingabevalidierungstools

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.