Regex-Spickzettel — jedes Token mit Beispielen
Jedes Token regulärer Ausdrücke mit funktionierendem Beispiel, Unterstützung in JavaScript, PCRE/PHP, Python, Go, Java und .NET und einem „Ausprobieren“-Link, der den Regex-Tester vorausgefüllt öffnet.
Zuletzt geprüft: 2026-10-18, abgeglichen mit ECMAScript 2025 (MDN), PCRE2 10.45, Python 3.14 re, Go 1.27 regexp/syntax, Java 25 Pattern und der .NET-Regex-Referenz. Quellen: MDN regular expressions, PCRE2 pattern syntax, Python re, Go regexp/syntax, Java Pattern, .NET regex quick reference.
Zeichen und Escapes
Die meisten Zeichen stehen für sich selbst. Diese zwölf haben eine besondere Bedeutung und brauchen einen Backslash, um wörtlich gefunden zu werden: \ ^ $ . | ? * + ( ) [ { (und ] } an manchen Stellen).
.Beliebiges ZeichenEin beliebiges einzelnes Zeichen außer einem Zeilenumbruch. Mit dem Flag s (dotAll) zählen auch Zeilenumbrüche dazu.
/h.t/g
auf “hat hot h t hit h↵t”
findet “hat” “hot” “h t” “hit”- Python re: Schließt nur \n aus; JavaScript schließt auch \r, \u2028 und \u2029 aus.
- Go RE2: Schließt nur \n aus.
\. \$ \(Metazeichen escapenEin Backslash macht das nächste Sonderzeichen wörtlich: \. ist ein echter Punkt, \$ ein Dollarzeichen.
/\$\d+\.\d{2}/g
auf “Total $45.00, tax $3.15, tip 5”
findet “$45.00” “$3.15”\t \n \rTabulator, Zeilenvorschub, WagenrücklaufSteuerzeichen über ihren Namen. Windows-Zeilenenden sind \r\n; \r?\n findet beide Varianten.
/\w+\t\w+/g
auf “name⇥age↵ana⇥31”
findet “name⇥age” “ana⇥31”\xhhZeichen per Hex-CodeGenau zwei Hex-Ziffern: \x41 ist A, \x20 ein Leerzeichen.
/\x41/g
auf “A b A”
findet “A” “A”\uhhhhZeichen per Unicode-CodeeinheitVier Hex-Ziffern für ein Zeichen der Basic Multilingual Plane: \u00e9 ist é.
/\u00e9/g
auf “café résumé”
findet “é” “é” “é”- PCRE / PHP: Nutze \x{e9}.
- Go RE2: Nutze \x{e9}.
\u{1F600}Beliebiger Codepunkt (auch astrale)Codepunkt in geschweiften Klammern, nötig für Emojis und andere Zeichen oberhalb von U+FFFF. JavaScript braucht das Flag u oder v.
/\u{1F600}/gu
auf “Hi 😀 there 😀”
findet “😀” “😀”- PCRE / PHP: Schreibe \x{1F600} (PHP braucht den Modifikator u).
- Python re: Schreibe \U0001F600 (acht Hex-Ziffern).
- Go RE2: Schreibe \x{1F600}.
- Java: Schreibe \x{1F600}.
- .NET: Nur \uhhhh; ein Emoji besteht aus zwei UTF-16-Codeeinheiten, z. B. \uD83D\uDE00.
Zeichenklassen
Eine Klasse findet genau ein Zeichen aus einer Menge. Innerhalb von [ ] verlieren die meisten Metazeichen ihre Bedeutung; nur bei ] \ ^ und - musst du aufpassen.
[abc]Eines vonEin Zeichen aus der Liste.
/gr[ae]y/g
auf “gray grey groy”
findet “gray” “grey”[^abc]Keines vonEin Zeichen, das nicht in der Liste steht (ein ^ an anderer als erster Stelle ist wörtlich). Findet auch Zeilenumbrüche.
/[^aeiou\s]/g
auf “regex”
findet “r” “g” “x”[a-z]BereichZeichen zwischen zwei Codepunkten. Bereiche lassen sich kombinieren: [A-Fa-f0-9] ist eine Hex-Ziffer. Ein - am Anfang oder Ende ist wörtlich.
/[A-Fa-f0-9]+/g
auf “x: 3fA9 zz”
findet “3fA9”\d \DZiffer / keine Ziffer\d ist eine Ziffer, \D alles andere.
/\d+/g
auf “Order 66, room 101”
findet “66” “101”- Python re: In str-Mustern findet \d jede Unicode-Ziffer (z. B. ٣); mit re.ASCII nur 0-9.
- .NET: Findet jede Unicode-Ziffer, sofern RegexOptions.ECMAScript nicht gesetzt ist.
\w \WWortzeichen / Nicht-WortzeichenBuchstaben, Ziffern und Unterstrich. In JavaScript und Go heißt das nur ASCII: \w findet kein é.
/\w+/g
auf “snake_case and kebab-case”
findet “snake_case” “and” “kebab” “case”- PCRE / PHP: ASCII, außer mit PCRE2_UCP (PHP: Modifikator u plus (*UCP)).
- Python re: In str-Mustern standardmäßig Unicode-Buchstaben und -Ziffern.
- Java: ASCII, außer das Flag U (UNICODE_CHARACTER_CLASS) ist aktiv.
- .NET: Unicode-Buchstaben, -Ziffern und Verbindungszeichen.
\s \SLeerraum / kein LeerraumLeerzeichen, Tabulator, Zeilenumbrüche und (in den meisten Engines) weitere Unicode-Leerzeichen.
/\s+/g
auf “a b⇥c”
findet “ ” “⇥”- Go RE2: Nur ASCII-Leerraum: \t \n \f \r und Leerzeichen.
[[:alpha:]]POSIX-Klasse in KlammernBenannte Klassen wie [:alpha:], [:digit:], [:space:], [:punct:], innerhalb eckiger Klammern verwendet.
[[:alpha:]]+- JavaScript: Nutze [A-Za-z] oder \p{L} mit dem Flag u.
- Java: Nutze \p{Alpha}, \p{Digit}, \p{Punct}.
[\p{L}--[a-z]]Klassen-Subtraktion / -SchnittmengeMengenoperationen innerhalb einer Klasse. JavaScript braucht das Flag v (ES2024): -- subtrahiert, && bildet die Schnittmenge.
/[\p{L}--[a-z]]+/gv
auf “abcÉtéXYZ”
findet “É” “éXYZ”- PCRE / PHP: Nur PCRE2 10.45+, mit der erweiterten Klassensyntax (?[ … ]).
- Java: Schnittmenge [a-z&&[^aeiou]]; Subtraktion schreibt man als Schnittmenge mit einer Negation.
- .NET: Subtraktion [a-z-[aeiou]]; keine Schnittmenge.
Anker und Grenzen
Anker finden eine Position, kein Zeichen, und verbrauchen deshalb nie Text.
^ $Anfang / Ende des Strings (oder der Zeile mit m)Ohne das Flag m sind ^ und $ Anfang und Ende der gesamten Eingabe; mit m die jeder Zeile.
/^\w+/gm
auf “first line↵second line”
findet “first” “second”- PCRE / PHP: $ passt auch vor einem abschließenden \n.
- Python re: $ passt auch vor einem abschließenden \n.
- Java: $ passt auch vor einem abschließenden Zeilenendezeichen.
- .NET: $ passt auch vor einem abschließenden \n.
\bWortgrenzeZwischen einem Wortzeichen und einem Nicht-Wortzeichen (oder dem Rand der Eingabe). Damit findest du ganze Wörter.
/\bcat\b/g
auf “cat concat cats cat.”
findet “cat” “cat”- JavaScript: Nur ASCII-Wortzeichen, auch mit dem Flag u.
- Go RE2: Nur ASCII-Wortzeichen.
\BKeine WortgrenzeInnerhalb eines Worts, z. B. „cat“ nur, wenn es Teil eines längeren Worts ist.
/\Bcat/g
auf “concat cat bobcat”
findet “cat” “cat”\A \z \ZAbsoluter Anfang / absolutes EndeAnfang und Ende der Eingabe, unabhängig vom Mehrzeilenmodus. \Z erlaubt zusätzlich einen abschließenden Zeilenumbruch (außer in Python, wo es ein Synonym für \z ist).
\A\d+\z- JavaScript: Nutze ^ und $ ohne das Flag m.
- Python re: \A und \z (3.14+); \Z bedeutet absolutes Ende, wie \z anderswo.
- Go RE2: \A und \z; kein \Z.
\GEnde des vorherigen TreffersPosition, an der der letzte Treffer endete; dient zum Finden zusammenhängender Folgen.
\G\d- JavaScript: Kein \G; das Flag y (sticky) liefert dasselbe Verhalten „genau hier beginnen“.
Quantoren: gierig, genügsam, possessiv
Ein Quantor wiederholt das Element davor. Gierig (Standard) nimmt so viel wie möglich und gibt dann wieder ab; genügsam (mit ?) nimmt so wenig wie möglich; possessiv (mit +) gibt nie etwas ab.
*Null oder mehr0- bis unbegrenzt oft wiederholen.
/ba*/g
auf “b ba baaa”
findet “b” “ba” “baaa”+Eins oder mehr1- bis unbegrenzt oft wiederholen.
/lo+l/g
auf “lol loool ll”
findet “lol” “loool”?OptionalNull- oder einmal.
/colou?r/g
auf “color colour colouur”
findet “color” “colour”{n}Genau nGenau n Wiederholungen.
/\d{3}/g
auf “12 345 6789”
findet “345” “678”{n,}n oder mehrMindestens n Wiederholungen.
/\d{2,}/g
auf “1 22 333”
findet “22” “333”{n,m}Zwischen n und mn bis m Wiederholungen, so viele wie möglich.
/\d{2,3}/g
auf “1 22 4444”
findet “22” “444”- Go RE2: Anzahlen über 1000 werden abgelehnt.
{,m}Bis zu mNull bis m Wiederholungen. Nur manche Engines akzeptieren das; anderswo ist es der wörtliche Text „{,m}“ oder ein Fehler. {0,m} funktioniert überall.
\d{,3}- JavaScript: Ohne u wörtlicher Text, mit u ein Syntaxfehler; schreibe {0,3}.
- PCRE / PHP: Nur PCRE2 10.43+.
- Go RE2: Schreibe {0,3}.
- Java: Schreibe {0,3}.
- .NET: Wird als wörtlicher Text behandelt; schreibe {0,3}.
.* .+Gierig (Standard)Nimmt den längstmöglichen Treffer und gibt dann Zeichen zurück, bis der Rest passt. Hier verschluckt er beide Tags.
/<.+>/g
auf “<b>bold</b>”
findet “<b>bold</b>”*? +? ?? {n,m}?Genügsam (nicht gierig)Nimmt den kürzestmöglichen Treffer. Meist die Lösung, wenn ein Muster „zu viel findet“.
/<.+?>/g
auf “<b>bold</b>”
findet “<b>” “</b>”- Go RE2: Auch als Flag U verfügbar, das gierig und genügsam vertauscht.
*+ ++ ?+PossessivGierig ohne Backtracking: Einmal gefundene Zeichen werden nie zurückgegeben. Scheitert schneller und schützt vor katastrophalem Backtracking.
"[^"]*+"- JavaScript: Keine possessiven Quantoren oder atomaren Gruppen; nachbilden mit (?=(…))\1.
- Python re: Python 3.11+.
- Go RE2: Nicht nötig: RE2 macht nie Backtracking.
- .NET: Nutze eine atomare Gruppe (?>…).
Gruppen und Rückverweise
Klammern fassen Elemente für Quantoren und Alternativen zusammen und speichern (sofern nicht als nicht erfassend markiert), was sie gefunden haben.
( … )Erfassende GruppeGruppiert und erfasst; nummeriert ab 1 nach öffnender Klammer.
/(\d{3})-(\d{4})/g
auf “Call 555-0199 or 555-0123”
findet “555-0199” “555-0123”(?: … )Nicht erfassende GruppeGruppiert, ohne zu speichern – so bleiben die Gruppennummern stabil, und das Matching ist etwas günstiger.
/(?:ab)+/g
auf “ababab ab a”
findet “ababab” “ab”(?<name> … )Benannte GruppeErfasst unter einem Namen, über den du den Wert wieder auslesen kannst (match.groups.name in JavaScript).
/(?<year>\d{4})-(?<month>\d{2})/g
auf “Released 2026-10”
findet “2026-10”- PCRE / PHP: Auch (?'name'…) und (?P<name>…).
- Python re: Nur (?P<name>…).
- Go RE2: (?P<name>…); seit Go 1.22 wird auch (?<name>…) akzeptiert.
- .NET: Auch (?'name'…).
\1Rückverweis per NummerFindet denselben Text, den eine Gruppe zuvor erfasst hat.
/(\w)\1/g
auf “bookkeeper”
findet “oo” “kk” “ee”- Go RE2: RE2 hat keine Rückverweise (sie würden die Garantie linearer Laufzeit brechen).
\k<name>Rückverweis per NameWie \1, aber über den Namen. Das Beispiel findet Text in passenden Anführungszeichen.
/(?<q>['"]).*?\k<q>/g
auf “say "hi" or 'yo'”
findet “"hi"” “'yo'”- PCRE / PHP: Auch \k{name}, \g{name} und (?P=name).
- Python re: Schreibe (?P=name).
a|bAlternative (oder)Eine der beiden Seiten. Alternativen werden von links nach rechts probiert; setz also längere zuerst, wenn eine das Präfix einer anderen ist.
/cat|dog/g
auf “hotdog catalog”
findet “dog” “cat”(?> … )Atomare GruppeHat die Gruppe einmal gepasst, springt die Engine nicht per Backtracking in sie zurück.
(?>a|ab)c- Python re: Python 3.11+.
- Go RE2: Nicht nötig: RE2 macht nie Backtracking.
(?i) (?i: … )Inline-FlagsFlags innerhalb des Musters ein- oder ausschalten. (?i) gilt für den Rest des Musters; (?i:…) nur für die Gruppe; (?-i:…) schaltet ein Flag aus.
/(?i:hello) world/g
auf “HELLO world HELLO WORLD”
findet “HELLO world”- JavaScript: Nur die begrenzte Form (?i:…) / (?-i:…), für i, m und s (ES2025). (?i) am Anfang ist ein Syntaxfehler.
- Python re: Ein globales (?i) muss ganz am Anfang des Musters stehen (anderswo seit 3.11 ein Fehler); (?i:…) funktioniert überall.
(?(1)yes|no)BedingungFindet „yes“, wenn Gruppe 1 beteiligt war, sonst „no“.
(<)?\w+(?(1)>)(?R) (?1)Rekursion / SubroutineRuft das ganze Muster oder eine Gruppe erneut auf, für verschachtelte Strukturen wie ausgeglichene Klammern.
\((?:[^()]|(?R))*\)- Python re: Im externen Modul regex verfügbar.
- .NET: Keine Rekursion; Balancing Groups (?<open-close>…) übernehmen die Verschachtelung.
(?# … )Inline-KommentarWird von der Engine ignoriert. Für längere Kommentare nutze das Flag x (extended).
\d{3}(?#area code)Lookahead und Lookbehind
Lookarounds prüfen, was neben der aktuellen Position steht, ohne es in den Treffer aufzunehmen. Sie haben wie Anker die Breite null.
(?= … )Positiver LookaheadGefolgt von … (nicht Teil des Treffers).
/\d+(?=px)/g
auf “10px 20em 30px”
findet “10” “30”- Go RE2: RE2 kennt keinerlei Lookarounds.
(?! … )Negativer LookaheadNicht gefolgt von …. Das \d darin verhindert, dass die Engine Ziffern zurückgibt, nur damit die Prüfung besteht.
/\d+(?!px|\d)/g
auf “10px 20em”
findet “20”(?<= … )Positiver LookbehindVorangestellt von … (nicht Teil des Treffers).
/(?<=\$)\d+(?:\.\d\d)?/g
auf “Cost: $42.50 or 42”
findet “42.50”- JavaScript: Beliebige Länge (ES2018).
- PCRE / PHP: Jede Alternative muss eine begrenzte Länge haben; variable Länge (standardmäßig max. 255) seit PCRE2 10.43.
- Python re: Nur feste Breite: (?<=ab|cd) geht, (?<=a+) ist ein Fehler.
- Java: Nur begrenzte Länge: kein * oder + darin.
- .NET: Beliebige Länge.
(?<! … )Negativer LookbehindNicht vorangestellt von ….
/(?<!\$)\b\d+\b/g
auf “$30 and 45”
findet “45”- PCRE / PHP: Gleiche Längenregeln wie beim positiven Lookbehind.
- Python re: Nur feste Breite.
- Java: Nur begrenzte Länge.
\KTrefferanfang zurücksetzenEntfernt alles bisher Gefundene aus dem Ergebnis; ein Lookbehind ohne Längenbegrenzung.
price: \K\d+- JavaScript: Nutze (?<=…) oder eine erfassende Gruppe.
Flags (Modifikatoren)
JavaScript schreibt Flags hinter den schließenden Schrägstrich (/x/gi). Andere Sprachen übergeben Konstanten (re.I, Pattern.CASE_INSENSITIVE, RegexOptions.IgnoreCase) oder nutzen inline (?i).
gGlobal (alle Treffer)Findet jeden Treffer, statt beim ersten aufzuhören. Erforderlich für matchAll und replaceAll.
/o/g
auf “foo boo”
findet “o” “o” “o” “o”- PCRE / PHP: Kein Flag: nutze preg_match_all() / preg_replace().
- Python re: Kein Flag: nutze re.findall(), re.finditer(), re.sub().
- Go RE2: Kein Flag: nutze die FindAll…-Methoden.
- Java: Kein Flag: Schleife mit matcher.find().
- .NET: Kein Flag: nutze Regex.Matches().
iGroß-/Kleinschreibung ignorierenSuche ohne Beachtung der Groß-/Kleinschreibung.
/hello/gi
auf “Hello HELLO hello”
findet “Hello” “HELLO” “hello”- Python re: re.I / re.IGNORECASE oder (?i).
- Java: CASE_INSENSITIVE (ASCII, außer mit UNICODE_CASE) oder (?i).
- .NET: RegexOptions.IgnoreCase oder (?i).
mMehrzeilig^ und $ passen an Zeilenanfängen und -enden, nicht nur an den Enden der Eingabe.
/^-\s.+$/gm
auf “- one↵- two↵three”
findet “- one” “- two”- Python re: re.M / re.MULTILINE.
- .NET: RegexOptions.Multiline.
sPunkt findet ZeilenumbruchLässt . auch Zeilenumbrüche finden. Ohne das Flag ist [\s\S] das portable „alles“.
/<p>.*?</p>/gs
auf “<p>a↵b</p>”
findet “<p>a↵b</p>”- Python re: re.S / re.DOTALL.
- Java: Pattern.DOTALL.
- .NET: Heißt RegexOptions.Singleline.
xErweitert (freie Leerzeichen)Leerraum im Muster wird ignoriert, und # leitet einen Kommentar ein – so lassen sich lange Muster über mehrere Zeilen verteilen.
(?x) \d{3} - \d{4} # local number- Python re: re.X / re.VERBOSE.
- Java: Pattern.COMMENTS.
- .NET: RegexOptions.IgnorePatternWhitespace.
uUnicodeBehandelt die Eingabe als Codepunkte (sodass . ein ganzes Emoji findet), aktiviert \p{…} und \u{…} und macht ungültige Escapes zu Fehlern.
/^.$/gu
auf “😀”
findet “😀”- PCRE / PHP: PHP-Modifikator u (UTF-8-Modus); ergänze (*UCP) für Unicode-\w und -\d.
- Python re: Kein Flag nötig: str-Muster sind Unicode; re.ASCII schaltet das ab.
- Go RE2: Kein Flag: Go arbeitet immer mit UTF-8-Codepunkten.
- Java: UNICODE_CASE und UNICODE_CHARACTER_CLASS (U).
- .NET: Kein Flag: immer UTF-16-Codeeinheiten (ein Emoji sind zwei).
vUnicode-MengenES2024-Erweiterung von u: Mengenoperationen in Klassen (--, &&), verschachtelte Klassen und String-Eigenschaften wie \p{RGI_Emoji}. Nicht mit u kombinierbar.
/[\p{L}&&\p{ASCII}]+/gv
auf “Ünïcode text”
findet “n” “code” “text”yStickyJeder Treffer muss genau dort beginnen, wo der vorherige endete (lastIndex). Nützlich für Tokenizer.
/\d/gy
auf “12a3”
findet “1” “2”- PCRE / PHP: Nutze \G.
- Python re: Nutze pattern.match(text, pos).
- Java: Nutze \G oder matcher.lookingAt().
- .NET: Nutze \G.
dTrefferindizesErgänzt match.indices mit Anfang und Ende jeder erfassenden Gruppe (ES2022).
/(?<y>\d{4})/d- PCRE / PHP: Offsets sind immer verfügbar (PREG_OFFSET_CAPTURE).
- Python re: Immer verfügbar: m.span(n).
- Go RE2: Immer verfügbar: FindStringSubmatchIndex.
- Java: Immer verfügbar: matcher.start(n) / end(n).
- .NET: Immer verfügbar: Group.Index / Length.
Unicode-Eigenschaften \p{…}
Property-Escapes finden Zeichen nach Unicode-Kategorie oder Schrift – der einzige verlässliche Weg, „jeden Buchstaben“ sprachübergreifend zu finden. In JavaScript brauchen sie das Flag u oder v.
\p{L}Beliebiger BuchstabeBuchstaben jeder Schrift: é, ß, 東, д.
/\p{L}+/gu
auf “naïve café 東京 123”
findet “naïve” “café” “東京”- PCRE / PHP: PHP braucht für UTF-8-Eingaben den Modifikator u.
- Python re: Nutze das externe Modul regex oder [^\W\d_] für „Buchstaben“.
\p{Lu} \p{Ll}Groß- / KleinbuchstabeAllgemeine Kategorien: Lu Großbuchstabe, Ll Kleinbuchstabe, N Zahl, P Satzzeichen, S Symbol, Z Trennzeichen.
/\p{Lu}/gu
auf “Élan Vital”
findet “É” “V”\P{…}Nicht in EigenschaftGroßes P negiert: \P{L} ist alles, was kein Buchstabe ist.
/\P{L}+/gu
auf “abc-123”
findet “-123”\pLKurzform mit einem BuchstabenKategorien aus einem Buchstaben ohne geschweifte Klammern.
\pL+- JavaScript: Geschweifte Klammern sind Pflicht: \p{L}.
- .NET: Geschweifte Klammern sind Pflicht: \p{L}.
\p{Script=Greek}SchriftZeichen eines Schriftsystems. sc= ist die Kurzform; Script_Extensions (scx=) schließt auch Zeichen ein, die sich mehrere Schriften teilen.
/\p{Script=Greek}+/gu
auf “alpha α, beta β”
findet “α” “β”- PCRE / PHP: \p{Greek}, \p{sc:Greek} oder \p{scx:Greek}.
- Go RE2: \p{Greek}.
- Java: Schreibe \p{script=Greek}, \p{sc=Greek} oder \p{IsGreek}.
- .NET: Nur benannte Blöcke wie \p{IsGreek} (ein Codebereich, nicht die Schrift).
\p{sc=Han}Chinesische Zeichen / japanische KanjiHan-Ideogramme. Für japanische Kana ergänze \p{sc=Hiragana} und \p{sc=Katakana}.
/\p{sc=Han}+/gu
auf “Tokyo 東京 2026 中文”
findet “東京” “中文”- PCRE / PHP: \p{Han}.
- Python re: Nutze einen Bereich wie [\u4e00-\u9fff] (deckt nur den Hauptblock ab).
- Go RE2: \p{Han}.
- Java: Auch \p{IsHan}.
- .NET: Nur Blöcke, z. B. \p{IsCJKUnifiedIdeographs}.
\p{RGI_Emoji}Emojis (ganze Sequenzen)Mit dem Flag v werden vollständige Emojis samt Hautfarben und Familiensequenzen gefunden. Mit u findet \p{Extended_Pictographic} nur einzelne Piktogramme.
/\p{RGI_Emoji}/gv
auf “Go 👍🏽 team 👨👩👧!”
findet “👍🏽” “👨👩👧”- PCRE / PHP: Einzelne Codepunkte über boolesche Eigenschaften in neueren PCRE2-Versionen (10.40+); keine Sequenz-Eigenschaft.
- Java: \p{IsEmoji} findet einzelne Codepunkte (Java 21+).
\XGraphem-ClusterEin Zeichen, wie Menschen es wahrnehmen, z. B. e + kombinierender Akzent oder ein Flaggen-Emoji.
\X- JavaScript: Nutze Intl.Segmenter zum Aufteilen in Grapheme.
- Python re: Im Modul regex verfügbar.
Syntax für Ersetzungen
Was du in den Ersetzungsstring schreibst. Hier unterscheiden sich die Sprachen am stärksten, daher zählt die Spalte deiner Sprache mehr als das JavaScript-Beispiel.
$&Ganzer TrefferFügt den gesamten gefundenen Text ein.
/\d+/g
auf “3 apples, 12 pears”
ersetzen durch “[$&]” → “[3] apples, [12] pears”- PCRE / PHP: $0 oder \0 in preg_replace.
- Python re: \g<0>.
- Go RE2: ${0} oder $0 (Expand / ReplaceAllString).
- Java: $0.
- .NET: Auch $0.
$1Nummerierte GruppeFügt ein, was Gruppe 1 erfasst hat. Zwei Wörter vertauschen:
/(\w+)\s(\w+)/g
auf “hello world”
ersetzen durch “$2 $1” → “world hello”- PCRE / PHP: Auch \1 und ${1}.
- Python re: \1 oder \g<1> (nutze einen Raw-String r"\1").
- Go RE2: Nutze ${1}x, wenn ein Buchstabe oder eine Ziffer folgt, sonst liest Go $1x als Gruppe namens „1x“.
$<name>Benannte GruppeFügt eine benannte Gruppe ein. Ein ISO-Datum in Tag/Monat/Jahr umformatieren:
/(?<y>\d{4})-(?<m>\d{2})-(?<d>\d{2})/g
auf “2026-10-18”
ersetzen durch “$<d>/$<m>/$<y>” → “18/10/2026”- PCRE / PHP: preg_replace kennt keine benannten Verweise; nutze die Gruppennummer oder preg_replace_callback().
- Python re: \g<name>.
- Go RE2: ${name} (oder $name).
- Java: ${name}.
- .NET: ${name}.
$$Wörtliches DollarzeichenMaskiert $ in der Ersetzung.
/(\d+)/g
auf “Price: 20”
ersetzen durch “$$$1” → “Price: $20”- PCRE / PHP: Ein $, auf das weder Ziffer noch { folgt, ist schon wörtlich; schreibe danach ${1}.
- Python re: $ ist nicht besonders; Backslashes maskierst du als \\.
- Java: \$ (Matcher.quoteReplacement() maskiert einen ganzen String).
$` $'Text vor / nach dem TrefferFügt die Eingabe vor oder nach dem Treffer ein. Selten nötig, aber gelegentlich praktisch.
/=/
auf “key=value”
ersetzen durch “ is set ($') and was ($`) ” → “key is set (value) and was (key) value”Häufige Rezepte (mit ehrlichen Einschränkungen)
Die meistgesuchten Muster, lesbar geschrieben und sicher vor katastrophalem Backtracking. Bei jedem steht, was es nicht leistet.
Email (practical)E-Mail-ähnliche Strings findenLokaler Teil, @ und eine Domain mit mindestens einem Punkt.
/[\w.+-]+@[\w-]+(?:\.[\w-]+)+/g
auf “Write to ana.lee+news@example.co.uk or bob@test.dev.”
findet “ana.lee+news@example.co.uk” “bob@test.dev”Einschränkung: Lehnt gültige, aber seltene Adressen ab (lokale Teile in Anführungszeichen, Nicht-ASCII-Domains) und akzeptiert manche ungültigen (a..b@x.y). Keine Regex kann dir sagen, ob ein Postfach existiert: Schick eine Bestätigungs-E-Mail.
URLhttp(s)-Links in Text findenStoppt an Leerraum, Anführungszeichen und spitzen Klammern und lässt abschließende Satzzeichen wie Punkt oder Komma weg.
/https?://[^\s<>"]*[^\s<>".,;:!?)]/g
auf “See https://example.com/a?b=1, or (http://test.dev/x).”
findet “https://example.com/a?b=1” “http://test.dev/x”Einschränkung: Gut, um Text zu verlinken, nicht zur Validierung. Zum Prüfen einer URL nutze den URL-Parser deiner Sprache (new URL() in JavaScript) und teste Protokoll und Host.
IPv4 addressVier Oktette 0–255Jedes Oktett auf 0–255 begrenzt, ohne führende Nullen.
/\b(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}\b/g
auf “10.0.0.1 256.1.1.1 192.168.1.254”
findet “10.0.0.1” “192.168.1.254”Einschränkung: Deckt kein IPv6, keine CIDR-Suffixe und keine Ports ab. Zur Validierung nutze einen IP-Parser (Python ipaddress, Go net/netip, Node net.isIP).
Date YYYY-MM-DDKalenderdatum nach ISO 8601Monat 01–12 und Tag 01–31.
/\b\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])\b/g
auf “2026-10-18, 2026-13-01, 2026-02-31”
findet “2026-10-18” “2026-02-31”Einschränkung: Prüft nur die Form: 2026-02-31 geht durch. Parse das Datum mit einer Datumsbibliothek, um unmögliche Tage abzulehnen.
Date MM/DD/YYYYUS-DatumsformatMonat und Tag ein- oder zweistellig, Jahr vierstellig.
/\b(?:0?[1-9]|1[0-2])/(?:0?[1-9]|[12]\d|3[01])/\d{4}\b/g
auf “Due 10/18/2026 or 1/5/2027, not 13/01/2026”
findet “10/18/2026” “1/5/2027”Einschränkung: 01/02/2026 ist in den USA der 2. Januar und fast überall sonst der 1. Februar; eine Regex kann nicht wissen, was gemeint war.
Phone (North America)(416) 555-0199 und VariantenZehn Ziffern mit optionalen Klammern, Leerzeichen, Punkten oder Bindestrichen.
/\(?\b\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}\b/g
auf “(416) 555-0199, 416.555.0199, 4165550199”
findet “(416) 555-0199” “416.555.0199” “4165550199”Einschränkung: Nur nordamerikanische Nummern. Für internationale Nummern nutze eine Bibliothek wie libphonenumber; speichere Nummern im E.164-Format (nächste Zeile).
Phone (E.164)Internationales Format +CC…Ein Pluszeichen, eine Ländervorwahl, die nicht mit 0 beginnt, insgesamt bis zu 15 Ziffern.
/^\+[1-9]\d{1,14}$/gm
auf “+14165550199↵+447911123456↵0044791112”
findet “+14165550199” “+447911123456”Einschränkung: Prüft die E.164-Form, nicht ob die Nummer vergeben ist oder die richtige Länge für ihr Land hat.
Hex colour#rgb, #rgba, #rrggbb, #rrggbbaaDie vier Längen, die CSS akzeptiert.
/#(?:[\da-fA-F]{8}|[\da-fA-F]{6}|[\da-fA-F]{3,4})\b/g
auf “#fff #244b3f #12345 #ff000080 #1234567”
findet “#fff” “#244b3f” “#ff000080”Einschränkung: Findet auch Treffer in längerem Text, etwa in URLs mit #Fragmenten; verankere mit ^…$, um einen einzelnen Wert zu validieren.
URL slugkleinbuchstaben-woerter-mit-bindestrichenKleinbuchstaben und Ziffern, getrennt durch einzelne Bindestriche.
/^[a-z0-9]+(?:-[a-z0-9]+)*$/gm
auf “my-post-2026↵My Post↵-bad-↵good”
findet “my-post-2026” “good”Einschränkung: Nur ASCII. Um Slugs aus Titeln zu erzeugen, nutze statt einer Regex den URL-Slug-Generator.
Trim whitespaceLeerzeichen am Anfang und EndeDurch einen leeren String ersetzen. Ohne das Flag m sind ^ und $ die Enden des gesamten Texts.
/^\s+|\s+$/g
auf “ padded text ”
ersetzen durch “” → “padded text”Einschränkung: Jede moderne Sprache hat ein eingebautes trim(), das schneller und klarer ist; nutze die Regex nur, wo du keinen Code aufrufen kannst (Editoren, Konfigurationsdateien).
Collapse spacesMehrere Leerzeichen zu einemZwei oder mehr Leerzeichen oder Tabs durch ein einzelnes Leerzeichen ersetzen.
/[ \t]{2,}/g
auf “too many ⇥ spaces”
ersetzen durch “ ” → “too many spaces”Duplicate wordsthe the, is isEin Wort, auf das es selbst folgt. Mit i wird auch „The the“ erkannt.
/\b(\w+)\s+\1\b/gi
auf “This is is a test test of The the editor”
findet “is is” “test test” “The the”Einschränkung: Braucht Rückverweise und funktioniert daher nicht in Go. „had had“ und „that that“ sind im Englischen manchmal korrekt (im Deutschen etwa „die die“).
Password rulesKlein-, Großbuchstabe, Ziffer, 12+ ZeichenJeder Lookahead prüft eine Regel ab dem Anfang; .{12,} legt die Länge fest.
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{12,}$/gm
auf “short1A↵alllowercase123↵GoodPassword42”
findet “GoodPassword42”Einschränkung: NIST SP 800-63B rät von Zusammensetzungsregeln ab: Verlange stattdessen eine Mindestlänge und prüfe gegen Listen geleakter Passwörter.
UUID8-4-4-4-12 hexVersionen 1–8 mit den Variant-Bits nach RFC 9562.
/\b[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\b/gi
auf “id 3f2b8c1e-9d4a-4b7e-8f6a-1c2d3e4f5a6b and 00000000-0000-0000-0000-000000000000”
findet “3f2b8c1e-9d4a-4b7e-8f6a-1c2d3e4f5a6b”Einschränkung: Lehnt die Nil-UUID (nur Nullen) und die Max-UUID (nur f) ab, die gültige Sonderwerte sind.
Eine statische Referenz: Suchen und Filtern passieren in deinem Browser, und die Ausprobieren-Links öffnen unseren Regex-Tester im Browser. Alle kostenlosen Tools ansehen.
Ein Problem gefunden oder etwas, das besser sein könnte? Wir lesen jede Nachricht und beheben Fehler schnell.
Dieser Regex-Spickzettel listet jedes Token regulärer Ausdrücke auf, das du wahrscheinlich brauchst, von \d und \b bis zu Lookbehind, possessiven Quantoren und \p{Script=Greek}, jeweils mit kurzer Erklärung und einem Beispiel, das genau zeigt, was es trifft. Jedes Beispiel hat einen „Ausprobieren“-Link, der unseren Regex-Tester mit Muster, Flags und Beispieltext bereits ausgefüllt öffnet – so kannst du es ändern und zusehen, wie sich die Treffer verschieben.
Regex sieht überall gleich aus, ist es aber nicht. Lookbehind ist in JavaScript und .NET unbegrenzt, in Python auf feste Breite beschränkt, in Java und PCRE begrenzt und fehlt in Go ganz. Python schreibt benannte Gruppen als (?P<name>…), PHP kann in einer Ersetzung keine Namen verwenden, und nur manche Engines kennen \A, \K oder (?R). Die Varianten-Auswahl zeigt die Unterstützung jedes Tokens in JavaScript, PCRE/PHP, Python, Go, Java und .NET, mit der alternativen Syntax, wo es eine gibt. Die Beispiele selbst laufen in JavaScript; für die anderen Sprachen lies die Hinweise und teste in der jeweiligen Sprache, bevor du etwas auslieferst.
So funktioniert’s
- Suche nach einem Token (\b, Lookahead) oder einer Aufgabe (E-Mail, Trimmen, doppelte Wörter) oder springe über die Chips oben zu einem Abschnitt.
- Wähle deine Sprache in der Variantenleiste. Tokens, die sie nicht unterstützt, werden abgeblendet, und der Hinweis unter jedem Eintrag nennt die Syntax, die deine Sprache stattdessen verwendet.
- Klicke auf „Im Regex-Tester ausprobieren“, um das Beispiel live auszuführen, und bearbeite dort Muster oder Text.
- Nutze das # neben einem Eintrag, um direkt darauf zu verlinken, oder „Drucken / Als PDF speichern“ für eine kompakte zweispaltige Fassung.
Häufige Fragen
Was ist der Unterschied zwischen gierigen und genügsamen Quantoren?
Ein gieriger Quantor (*, +, {n,m}) nimmt so viele Zeichen wie möglich und gibt einige zurück, wenn der Rest des Musters scheitert; ein genügsamer (*?, +?, {n,m}?) nimmt so wenige wie möglich. Bei <b>bold</b> trifft <.+> den ganzen String, während <.+?> <b> und </b> einzeln trifft. Possessive Quantoren (*+, ++) sind gierig und geben nie Zeichen zurück; JavaScript, Go und .NET haben sie nicht.
Welche Sprachen unterstützen Lookbehind?
JavaScript (seit ES2018) und .NET erlauben Lookbehind beliebiger Länge. Java verlangt eine begrenzte Maximallänge, also kein * oder + darin. Das re-Modul von Python akzeptiert nur Lookbehind mit fester Breite. PCRE2 verlangte bis 10.43, dass jede Alternative eine feste Länge hat; mit 10.43 kam Lookbehind variabler Länge bis zu einem Limit (standardmäßig 255 Zeichen). Die RE2-Engine von Go hat überhaupt kein Lookahead oder Lookbehind.
Wie treffe ich jeden Buchstaben, auch Buchstaben mit Akzent und nicht-lateinische?
Verwende die Unicode-Eigenschaft \p{L}. In JavaScript braucht sie das Flag u oder v (/\p{L}+/u); PCRE, Go, Java und .NET unterstützen sie direkt. [a-zA-Z] verfehlt é, ß und jede nicht-lateinische Schrift, und \w ist in JavaScript und Go nur ASCII. Das eingebaute re von Python hat kein \p{…}; nimm das Drittanbieter-Modul regex oder [^\W\d_], das in Python 3 Unicode-Buchstaben trifft.
Wie verwende ich eine gefangene Gruppe in der Ersetzung?
Das hängt von der Sprache ab: $1 in JavaScript, Java, .NET, Go und PHP; \1 oder \g<1> in Python. Benannte Gruppen sind $<name> in JavaScript, ${name} in Java, .NET und Go und \g<name> in Python; preg_replace von PHP hat keine benannte Form, nimm also die Nummer. Der gesamte Treffer ist $& in JavaScript und .NET, $0 in Java und PHP und \g<0> in Python.
Warum funktioniert meine Regex in JavaScript, aber nicht in Python (oder umgekehrt)?
Die üblichen Verdächtigen: benannte Gruppen ((?<name>) in JavaScript, (?P<name>) in Python), \p{…}-Eigenschaften (JavaScript ja, Python re nein), Lookbehind-Länge (beliebig in JavaScript, fest in Python), Inline-Flags ((?i) am Anfang funktioniert in Python, ist in JavaScript aber ein Fehler, das nur das begrenzte (?i:…) kennt) und \d oder \w, die in Python Unicode-Ziffern und -Buchstaben treffen, in JavaScript aber nur ASCII. Denk außerdem an das Escaping in Python-Strings: Schreib Muster als Raw-Strings, r"\d+".
Ist es sicher, E-Mail-Adressen mit einer Regex zu validieren?
Nur als Formprüfung. Ein praxistaugliches Muster wie [\w.+-]+@[\w-]+(?:\.[\w-]+)+ fängt Tippfehler ab, lehnt aber manche gültigen Adressen ab (lokale Teile in Anführungszeichen, internationalisierte Domains) und akzeptiert manche ungültigen. Kein Muster kann dir sagen, dass ein Postfach existiert – prüfe die Form also locker und schick dann eine Bestätigungs-E-Mail.
Muster schreiben, die in mehr als einer Sprache funktionieren
Wenn ein Muster in mehreren Engines laufen muss (eine gemeinsame Validierungsregel, eine Konfigurationsdatei, die von Diensten in verschiedenen Sprachen gelesen wird), bleib in der gemeinsamen Teilmenge. Diese Elemente verhalten sich in allen sechs Engines auf dieser Seite gleich:
• Literale Zeichen, Escapes wie \. und \$ sowie die Klassen [abc], [^abc] und [a-z].
• \d, \s und \w, solange deine Eingabe ASCII ist (Python und .NET treffen auch Unicode-Ziffern und -Buchstaben).
• ^ und $, \b, Alternation, fangende und nicht fangende Gruppen.
• Gierige und genügsame Quantoren: *, +, ?, {n}, {n,m} und ihre ?-Formen.
Lass Lookaround weg (Go hat keins), Rückverweise (Go), possessive Quantoren und atomare Gruppen (JavaScript, Go und .NET fehlt eines oder beides), benannte Gruppen (die Syntax von Python weicht ab) und \p{…} (dem re von Python fehlt es). Wenn du eines davon brauchst, halte eine Fassung des Musters pro Sprache vor und teste jede.
Katastrophales Backtracking vermeiden
Backtracking-Engines (JavaScript, PCRE, Python, Java, .NET) können exponentiell lange brauchen bei Mustern, in denen eine quantifizierte Gruppe denselben Text auf viele Arten treffen kann, etwa (a+)+$ oder (\w|\d)*x. Bei einer langen Eingabe, die fast passt, probiert die Engine vor dem Scheitern jede Aufteilung aus, und ein Webserver kann an einer einzigen Anfrage hängen bleiben. Das ist das Problem des Regular Expression Denial of Service (ReDoS).
Die Lösungen sind mechanisch: Vermeide verschachtelte Quantoren über dieselben Zeichen; mach Alternativen gegenseitig ausschließend; nimm eine negierte Klasse wie [^"]* statt .*?, wenn du das Trennzeichen kennst; verwende possessive Quantoren oder atomare Gruppen, wo deine Engine sie hat; und begrenze die Eingabelänge vor dem Matching. .NET bietet außerdem RegexOptions.NonBacktracking und ein Match-Timeout, PCRE hat einstellbare Match-Limits, und die RE2-Engine von Go garantiert lineare Laufzeit, indem sie die Features, die Backtracking brauchen, gar nicht erst unterstützt.
Regex in Strings escapen
Die meisten Regex-Fehler in echtem Code sind Escaping-Fehler in Strings, keine Regex-Fehler. Der Backslash ist sowohl für das String-Literal der Sprache als auch für die Regex-Engine ein Sonderzeichen, ein als normaler String geschriebenes Muster braucht also doppelte Backslashes.
• JavaScript: Ein Literal /\d+/ braucht einen Backslash; new RegExp("\\d+") braucht zwei. String.raw`\d+` vermeidet die Verdopplung.
• Python: Verwende immer Raw-Strings, r"\d+"; sonst ist "\b" ein Backspace-Zeichen und keine Wortgrenze.
• Java und C#: "\\d+" in normalen Strings (auch Java-Textblöcke verarbeiten Escapes); C#-Verbatim-Strings, @"\d+", behalten Backslashes so, wie sie getippt wurden.
• Go: Raw-Strings in Backticks, `\d+`, sind mit regexp.MustCompile die Norm.
• PHP: Muster enthalten Begrenzer, '/\d+/', und Strings in einfachen Anführungszeichen behalten die meisten Backslashes so, wie sie getippt wurden.
Ähnliche kostenlose Tools
- Regex-Tester — Teste einen regulären Ausdruck an Beispieltext mit Live-Hervorhebung der Treffer, Capture Groups und Vorschau fürs Ersetzen. Kostenlos, im Browser.
- Git-Spickzettel — Git-Befehle geordnet nach dem, was du tun willst: letzten Commit rückgängig machen, Branch umbenennen, Remote-Branch löschen. Modernes switch/restore mit klassischen Entsprechungen und Warnhinweisen.
- Markdown-Spickzettel — Jedes Markdown-Element mit Quelltext und gerenderter Vorschau, erweiterte Syntax (Tabellen, Aufgabenlisten, Fußnoten, Mathematik, Mermaid, Hinweisboxen), eine Kompatibilitätstabelle für 9 Plattformen und ein Live-Playground.
- Cron-Generator — Erstelle einen Cron-Zeitplan per Dropdown oder füge einen ein, lies ihn in Klartext und sieh die nächsten 10 Ausführungen in deiner Zeitzone und in UTC. Kostenlos, im Browser.
- Diff-Checker — Vergleiche zwei Versionen eines Textes, Codes oder einer JSON-Datei und sieh genau, welche Zeilen, Wörter und Zeichen sich geändert haben.