Zum Inhalt springen

Regex-Spickzettel

Reguläre Ausdrücke sind kompakt genug, dass die Syntax leichter nachzuschlagen als auswendig zu lernen ist. Diese Seite ist das Ganze auf einem Bildschirm — Klassen, Quantoren, Anker, Gruppen, Lookaround, Escapen und die Flags — mit einem funktionierenden Beispiel für jede Zeile.

Der Dialekt ist JavaScript, das ist, was in deinem Browser läuft und was der Regex-Tester auf dieser Website verwendet. Das meiste davon ist identisch in Python, Java, Go und PCRE; wo Dialekte voneinander abweichen, weichen sie an den Rändern ab — Lookbehind-Unterstützung, Syntax für benannte Gruppen und ob \d "ASCII-Ziffer" oder "beliebige Unicode-Ziffer" bedeutet.

Zwei Dinge sind für die meisten Überraschungen verantwortlich. Quantoren sind gierig: Sie nehmen alles, was sie können, und geben nur zurück, wenn der Rest des Musters fehlschlägt, weshalb <.+> zwei Tags verschlingt und <.+?> nicht. Und die Alternation bindet am schwächsten von allen, sodass ^a|b$ "beginnt mit a oder endet mit b" bedeutet — nicht das, was die meisten Leute beabsichtigen, wenn sie es schreiben.

Zeichenklassen

11

Die Kurzformen sind ASCII-only, es sei denn, du fügst das u-Flag hinzu und verwendest Unicode-Eigenschafts-Escapes.

SyntaxBedeutungBeispiel
.Beliebiges Zeichen außer einem ZeilenumbruchFüge das s-Flag hinzu, damit es auch Zeilenumbrüche matcht./a.c/"abc" "abc"
\dEine Ziffer, 0–9/\d+/"order 42" "42"
\DAlles, was keine Ziffer ist/\D+/"42abc" "abc"
\wBuchstabe, Ziffer oder UnterstrichNur ASCII — "é" ist kein \w./\w+/"user_1!" "user_1"
\WAlles, was \w nicht matcht/\W+/"a++b" "++"
\sBeliebiger Leerraum, einschließlich Tabs und Zeilenumbrüchen/\s+/"a \t b" " \t "
\SBeliebiges Nicht-Leerraum-Zeichen/\S+/" hi" "hi"
[abc]Beliebiges der aufgeführten Zeichen/[aeiou]/"rhythm and" "a"
[^abc]Beliebiges Zeichen außer den aufgeführten/[^aeiou ]+/"aeiou xyz" "xyz"
[a-z]Ein Zeichenbereich/[a-f]+/"zzabcz" "abc"
\p{L}Beliebiger Unicode-Buchstabe (benötigt das u-Flag)/\p{L}+/"42 café" "café"

Quantoren

7

Alle diese sind standardmäßig gierig: Sie nehmen so viel sie können und geben nur zurück, wenn der Rest des Musters fehlschlägt.

SyntaxBedeutungBeispiel
*Null oder mehr/ab*/"a" "a"
+Eins oder mehr/ab+/"abbb" "abbb"
?Null oder eins — macht es optional/colou?r/"color" "color"
{3}Genau drei/\d{3}/"id 12345" "123"
{2,}Zwei oder mehr/a{2,}/"aaa" "aaa"
{2,4}Zwischen zwei und vier/a{2,4}/"aaaaa" "aaaa"
*?Genügsam — nimmt so wenig wie möglichDas gierige <.+> würde beide Tags verschlingen./<.+?>/"<a><b>" "<a>"

Anker und Grenzen

4

Diese matchen eine Position, kein Zeichen, verbrauchen also nichts.

SyntaxBedeutungBeispiel
^Anfang der Zeichenkette oder einer Zeile mit dem m-Flag/^a/"abc" "a"
$Ende der Zeichenkette oder einer Zeile mit dem m-Flag/c$/"abc" "c"
\bEine WortgrenzeDas ist, was verhindert, dass "cat" innerhalb von "concatenate" matcht./\bcat\b/"the cat sat" "cat"
\BKeine Wortgrenze/\Bcat/"concatenate" "cat"

Gruppen und Alternation

5
SyntaxBedeutungBeispiel
(abc)Erfassende Gruppe — für die Ersetzung gemerkt/(\d+)-(\d+)/"10-20" "10-20"
(?:abc)Gruppierung ohne ErfassungVerwende dies, wenn du nur die Gruppierung brauchst; es hält die Erfassungsnummern sinnvoll./(?:ab)+/"abab" "abab"
(?<name>…)Benannte erfassende Gruppe/(?<year>\d{4})/"in 2026" "2026"
a|bEntweder-oder — AlternationDie Alternation hat die niedrigste Priorität: ^a|b$ ist "^a" oder "b$", nicht "^(a|b)$"./cat|dog/"one dog" "dog"
\1Rückverweis auf die erste Gruppe/(\w)\1/"letter" "tt"

Lookaround

4

Zusicherungen darüber, was eine Position umgibt. Sie matchen selbst nichts, was sie sicher kombinierbar macht.

SyntaxBedeutungBeispiel
(?=…)Lookahead — gefolgt von diesem/\d+(?= kg)/"80 kg" "80"
(?!…)Negativer Lookahead — nicht gefolgt von diesem/\d+(?! kg)/"80 lb" "80"
(?<=…)Lookbehind — mit diesem davor/(?<=\$)\d+/"costs $40" "40"
(?<!…)Negativer Lookbehind — nicht mit diesem davor/(?<!\$)\b\d+/"about 40" "40"

Escapen

5

Diese zwölf Zeichen sind jene, die einen Backslash brauchen, um wörtlich genommen zu werden.

SyntaxBedeutungBeispiel
\.Ein wörtlicher Punkt/\d\.\d/"v2.5" "2.5"
\\Ein wörtlicher Backslash/\\/"C:\\dir" "\\"
\nEin Zeilenvorschub/a\nb/"a\nb" "a\nb"
\tEin Tabulator/a\tb/"a\tb" "a\tb"
\uFFFFEin Zeichen anhand seines Codepunkts/\u00e9/"café" "é"

Flags

6
FlagNameBedeutung
gGlobalFindet jeden Treffer, nicht nur den ersten.
iGroß-/Kleinschreibung ignorierenMatcht unabhängig von Groß- oder Kleinschreibung.
mMultilineLässt ^ und $ an jedem Zeilenumbruch matchen statt nur an den Enden der Zeichenkette.
sDotAllLässt . auch Zeilenumbrüche matchen.
uUnicodeBehandelt das Muster als Codepunkte und aktiviert \p{…}-Eigenschafts-Escapes.
yStickyMatcht nur genau bei lastIndex, sucht nie vorwärts.

Häufige Fragen

Was ist der Unterschied zwischen gierigen und genügsamen Quantoren?
Gierige Quantoren (*, +, {2,}) matchen so viel wie möglich und geben Zeichen erst zurück, wenn der Rest des Musters nicht matchen kann. Ein angehängtes ? macht sie genügsam: Sie matchen so wenig wie möglich und nehmen nur mehr, wenn sie dazu gezwungen werden. Bei "<a><b>" liefert das Muster <.+> die gesamte Zeichenkette und <.+?> nur <a>.
Warum matcht mein Wort innerhalb anderer Wörter?
Weil nichts es verankert hat. Umschließe das Wort mit \b — /\bcat\b/ matcht "cat" in "the cat sat", aber nicht innerhalb von "concatenate". \b matcht eine Position zwischen einem Wortzeichen und einem Nicht-Wortzeichen, verbraucht also nichts.
Was ändert das u-Flag?
Es lässt das Muster auf Codepunkten statt auf UTF-16-Einheiten arbeiten, sodass ein einzelnes Emoji als ein Zeichen zählt, und es aktiviert \p{…}-Eigenschafts-Escapes wie \p{L} für "beliebiger Buchstabe". Ohne es bleiben \w und \d ASCII-only, weshalb "café" nicht vollständig auf /\w+/ matcht.
Wann sollte ich eine nicht-erfassende Gruppe verwenden?
Immer wenn du die Gruppierung brauchst, aber nicht den erfassten Text — (?:ab)+ statt (ab)+. Erfassungen kosten ein wenig Performance, aber der eigentliche Grund ist die Nummerierung: Jede erfassende Gruppe, die du hinzufügst, verschiebt die Nummern der nachfolgenden und bricht so still und heimlich Ersetzungen, die $1 und $2 verwenden.
Ist Lookbehind sicher zu verwenden?
In aktuellen Browsern und Node ja — (?<=…) und (?<!…) werden seit 2018 von jeder großen Engine unterstützt. Safari fügte es zuletzt hinzu. Wenn du sehr alte Laufzeitumgebungen anvisierst, prüfe es zuerst; für Regex-Syntax gibt es kein Polyfill.