regex — Reguläre Ausdrücke verstehen und anwenden
Referenz zu regulären Ausdrücken: Zeichenklassen, Anker, Quantoren, Gruppen und Lookarounds — die Regex-Syntax kompakt erklärt.
Reguläre Ausdrücke (regex) sind eine kompakte Sprache, um Muster in Text zu suchen, zu prüfen und zu ersetzen. Statt nach festen Zeichenketten zu suchen, beschreibst du mit Platzhaltern, Wiederholungen und Anker-Zeichen ganze Klassen von Treffern – etwa „vier Ziffern hintereinander" oder „eine E-Mail-Adresse". Du begegnest ihnen überall: in grep, sed und awk auf der Kommandozeile, in Editoren sowie in praktisch jeder Programmiersprache. Beachte dabei, dass es verschiedene Dialekte gibt – etwa BRE und ERE in den klassischen Unix-Tools oder PCRE in Perl, PHP und vielen modernen Sprachen –, weshalb sich Details bei Escapes und Erweiterungen unterscheiden können. Diese Referenz zeigt dir die Bausteine, die du in der Praxis am häufigsten brauchst.
Zeichenklassen
. — Matcht ein beliebiges einzelnes Zeichen (standardmäßig außer Zeilenumbruch).
h.t matches hat, hit, hot\d — Matcht eine beliebige Ziffer (0-9). Entspricht [0-9].
\d{3} matches 123, 456, 789\D — Matcht ein beliebiges Nicht-Ziffer-Zeichen.
\D+ matches abc, hello\w — Matcht ein beliebiges Wortzeichen (Buchstabe, Ziffer, Unterstrich). Entspricht [a-zA-Z0-9_].
\w+ matches hello_world, var123\W — Matcht ein beliebiges Nicht-Wortzeichen.
\W matches !, @, spaces\s — Matcht beliebigen Whitespace (Leerzeichen, Tab, Zeilenumbruch).
hello\sworld matches 'hello world'\S — Matcht ein beliebiges Nicht-Whitespace-Zeichen.
\S+ matches any non-space word[abc] — Matcht ein beliebiges Zeichen aus der Menge.
[aeiou] matches any vowel[^abc] — Matcht ein beliebiges Zeichen, das NICHT in der Menge ist.
[^0-9] matches any non-digit[a-z] — Matcht ein beliebiges Zeichen aus dem Bereich.
[a-zA-Z] matches any letterQuantoren
* — Matcht 0 oder mehr des vorangehenden Elements (gierig).
ab*c matches ac, abc, abbc, abbbc+ — Matcht 1 oder mehr des vorangehenden Elements (gierig).
ab+c matches abc, abbc but NOT ac? — Matcht 0 oder 1 des vorangehenden Elements (optional).
colou?r matches color and colour{n} — Matcht genau n Vorkommen.
\d{4} matches exactly 4 digits: 2026{n,} — Matcht n oder mehr Vorkommen.
\d{2,} matches 2 or more digits{n,m} — Matcht zwischen n und m Vorkommen.
\d{2,4} matches 12, 123, or 1234*? +? ?? — Genügsame (non-greedy) Varianten: matchen so wenig wie möglich.
<.*?> matches <b> in '<b>text</b>' (not the whole string)Anker & Grenzen
^ — Matcht den Anfang einer Zeile/Zeichenkette.
^Hello matches 'Hello World' but not 'Say Hello'$ — Matcht das Ende einer Zeile/Zeichenkette.
world$ matches 'hello world' but not 'world hello'\b — Matcht eine Wortgrenze (zwischen \w und \W).
\bcat\b matches 'cat' but not 'category'\B — Matcht eine Nicht-Wortgrenze.
\Bcat\B matches 'concatenate' but not 'cat'^...$ — Matcht die gesamte Zeichenkette (kombinierte Anker).
^\d{5}$ matches only exactly 5 digitsGruppen & Alternation
(abc) — Erfassende Gruppe: gruppiert und erfasst für Rückbezüge.
(\d{3})-(\d{4}) captures area code and number separately(?:abc) — Nicht-erfassende Gruppe: gruppiert ohne zu erfassen.
(?:https?://)? optionally matches http:// or https://a|b — Alternation: matcht a ODER b.
cat|dog matches 'cat' or 'dog'\1 \2 — Rückbezug: matcht denselben Text wie eine vorherige Gruppe.
(\w+)\s\1 matches repeated words like 'the the'(?<name>abc) — Benannte erfassende Gruppe.
(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})Lookahead & Lookbehind
(?=abc) — Positiver Lookahead: matcht, wenn abc folgt (ohne es zu konsumieren).
\d+(?= USD) matches '100' in '100 USD'(?!abc) — Negativer Lookahead: matcht, wenn abc NICHT folgt.
\d+(?! USD) matches '100' in '100 EUR' but not '100 USD'(?<=abc) — Positiver Lookbehind: matcht, wenn abc vorangeht.
(?<=\$)\d+ matches '50' in '$50'(?<!abc) — Negativer Lookbehind: matcht, wenn abc NICHT vorangeht.
(?<!\$)\d+ matches '50' in 'EUR 50' but not '$50'Flags / Modifikatoren
i — Groß-/Kleinschreibung ignorieren.
/hello/i matches Hello, HELLO, hellog — Global: alle Treffer finden, nicht nur den ersten.
/\d+/g finds all numbers in a stringm — Multiline: ^ und $ matchen Anfang/Ende jeder Zeile.
/^start/m matches 'start' at beginning of any lines — Dotall: . matcht auch Zeilenumbruch-Zeichen.
/start.*end/s matches across multiple linesHäufige Muster
^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,}$ — E-Mail-Adresse (einfache Validierung).
user@example.com, name.tag@sub.domain.org^https?://[\w.-]+(?:/[\w./?%&=-]*)?$ — URL (HTTP/HTTPS).
https://example.com/path?q=search^\d{1,3}(?:\.\d{1,3}){3}$ — IPv4-Adresse (einfache Formatprüfung).
192.168.1.1, 10.0.0.255^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$ — Hex-Farbcode.
#fff, #1a2b3c, 00ff00^\d{4}-\d{2}-\d{2}$ — Datum im ISO-8601-Format (YYYY-MM-DD).
2026-03-19^(?=.*[A-Z])(?=.*[a-z])(?=.*\d).{8,}$ — Passwort: mind. 8 Zeichen, Groß-, Kleinbuchstabe, Ziffer.
Passw0rd, MyS3cret! Fazit
Reguläre Ausdrücke sind mächtig, aber sie wollen mit Bedacht eingesetzt werden. Achte zuerst auf den Dialekt: BRE, ERE und PCRE unterscheiden sich darin, welche Zeichen du escapen musst und welche Erweiterungen (etwa Lookbehind oder benannte Gruppen) überhaupt verfügbar sind – ein Muster, das in PHP läuft, scheitert unter Umständen in grep. Behalte außerdem den Unterschied zwischen gierigen und genügsamen Quantoren im Auge: .* greift standardmäßig so viel wie möglich, was oft mehr matcht als gewollt – .*? schafft hier Abhilfe. Und Vorsicht bei komplexen, verschachtelten Mustern mit überlappenden Quantoren: Sie können „katastrophales Backtracking" (ReDoS) auslösen und eine Engine bei bestimmten Eingaben praktisch zum Stillstand bringen. Halte Muster so einfach wie möglich und teste sie an realen Daten.
Weiterführende Links
- Wikipedia: Regulärer Ausdruck – deutschsprachige Einführung in Theorie und Syntax
- regex101 – interaktiver Online-Tester mit Erklärung (englischsprachig)
- MDN: Reguläre Ausdrücke – ausführlicher deutschsprachiger Leitfaden (JavaScript-Dialekt)