Ga naar inhoud

Regex-spiekbriefje

Reguliere expressies zijn compact genoeg dat de syntaxis makkelijker op te zoeken dan te onthouden is. Deze pagina is het geheel ervan op één scherm — klassen, kwantoren, ankers, groepen, lookaround, escapen en de vlaggen — met een werkend voorbeeld voor elke regel.

De smaak is JavaScript, wat in je browser draait en wat de regextester op deze site gebruikt. Het meeste is identiek in Python, Java, Go en PCRE; waar smaken uiteenlopen, doen ze dat aan de randen — lookbehind-ondersteuning, syntaxis voor benoemde groepen, en of \d 'ASCII-cijfer' of 'elk Unicode-cijfer' betekent.

Twee dingen zijn verantwoordelijk voor de meeste verrassingen. Kwantoren zijn gulzig: ze pakken alles wat ze kunnen en geven pas terug wanneer de rest van het patroon mislukt, en daarom slikt <.+> twee tags op en <.+?> niet. En alternatie bindt het losst van allemaal, dus ^a|b$ betekent 'begint met a, of eindigt op b' — niet wat de meeste mensen bedoelen wanneer ze het schrijven.

Tekenklassen

11

De afkortingen zijn ASCII-only tenzij je de u-vlag toevoegt en Unicode-eigenschap-escapes gebruikt.

SyntaxisBetekenisVoorbeeld
.Elk teken behalve een regeleindeVoeg de s-vlag toe om het ook regeleindes te laten matchen./a.c/"abc" "abc"
\dEen cijfer, 0–9/\d+/"order 42" "42"
\DAlles wat geen cijfer is/\D+/"42abc" "abc"
\wLetter, cijfer of underscoreAlleen ASCII — "é" is geen \w./\w+/"user_1!" "user_1"
\WAlles wat \w niet matcht/\W+/"a++b" "++"
\sElke witruimte, inclusief tabs en regeleindes/\s+/"a \t b" " \t "
\SElk niet-witruimteteken/\S+/" hi" "hi"
[abc]Een van de opgesomde tekens/[aeiou]/"rhythm and" "a"
[^abc]Elk teken behalve de opgesomde/[^aeiou ]+/"aeiou xyz" "xyz"
[a-z]Een bereik van tekens/[a-f]+/"zzabcz" "abc"
\p{L}Elke Unicode-letter (vereist de u-vlag)/\p{L}+/"42 café" "café"

Kwantoren

7

Al deze zijn standaard gulzig: ze pakken zoveel als ze kunnen en geven pas terug als de rest van het patroon mislukt.

SyntaxisBetekenisVoorbeeld
*Nul of meer/ab*/"a" "a"
+Een of meer/ab+/"abbb" "abbb"
?Nul of een — maakt het optioneel/colou?r/"color" "color"
{3}Precies drie/\d{3}/"id 12345" "123"
{2,}Twee of meer/a{2,}/"aaa" "aaa"
{2,4}Tussen twee en vier/a{2,4}/"aaaaa" "aaaa"
*?Lui — pakt zo min mogelijkDe gulzige <.+> zou beide tags opslokken./<.+?>/"<a><b>" "<a>"

Ankers en grenzen

4

Deze matchen een positie, geen teken, dus ze verbruiken niets.

SyntaxisBetekenisVoorbeeld
^Begin van de string, of van een regel met de m-vlag/^a/"abc" "a"
$Einde van de string, of van een regel met de m-vlag/c$/"abc" "c"
\bEen woordgrensDit is wat voorkomt dat "cat" matcht binnen "concatenate"./\bcat\b/"the cat sat" "cat"
\BGeen woordgrens/\Bcat/"concatenate" "cat"

Groepen en alternatie

5
SyntaxisBetekenisVoorbeeld
(abc)Vangende groep — onthouden voor vervanging/(\d+)-(\d+)/"10-20" "10-20"
(?:abc)Groeperen zonder vangenGebruik dit wanneer je alleen de groepering nodig hebt; het houdt vangstnummers betekenisvol./(?:ab)+/"abab" "abab"
(?<name>…)Benoemde vangende groep/(?<year>\d{4})/"in 2026" "2026"
a|bBeide kanten — alternatieAlternatie heeft de laagste prioriteit: ^a|b$ is "^a" of "b$", niet "^(a|b)$"./cat|dog/"one dog" "dog"
\1Terugverwijzing naar de eerste groep/(\w)\1/"letter" "tt"

Lookaround

4

Beweringen over wat een positie omringt. Ze matchen zelf niets, en dat maakt ze veilig te combineren.

SyntaxisBetekenisVoorbeeld
(?=…)Lookahead — gevolgd door dit/\d+(?= kg)/"80 kg" "80"
(?!…)Negatieve lookahead — niet gevolgd door dit/\d+(?! kg)/"80 lb" "80"
(?<=…)Lookbehind — voorafgegaan door dit/(?<=\$)\d+/"costs $40" "40"
(?<!…)Negatieve lookbehind — niet voorafgegaan door dit/(?<!\$)\b\d+/"about 40" "40"

Escapen

5

Deze twaalf tekens zijn de tekens die een backslash nodig hebben om letterlijk te worden genomen.

SyntaxisBetekenisVoorbeeld
\.Een letterlijke punt/\d\.\d/"v2.5" "2.5"
\\Een letterlijke backslash/\\/"C:\\dir" "\\"
\nEen regelinvoer/a\nb/"a\nb" "a\nb"
\tEen tab/a\tb/"a\tb" "a\tb"
\uFFFFEen teken via zijn codepunt/\u00e9/"café" "é"

Vlaggen

6
VlagNaamBetekenis
gGlobaalVind elke match, niet alleen de eerste.
iHoofdletters negerenMatcht ongeacht hoofd- of kleine letters.
mMeerregeligLaat ^ en $ matchen bij elk regeleinde in plaats van alleen aan de uiteinden van de string.
sDot allLaat . ook regeleindes matchen.
uUnicodeBehandelt het patroon als codepunten en schakelt \p{…} eigenschap-escapes in.
yStickyMatcht alleen precies bij lastIndex, zoekt nooit vooruit.

FAQ

Wat is het verschil tussen gulzige en luie kwantoren?
Gulzige kwantoren (*, +, {2,}) matchen zoveel mogelijk en geven tekens pas terug wanneer de rest van het patroon niet kan matchen. Door ? toe te voegen worden ze lui: ze matchen zo min mogelijk en pakken pas meer wanneer het moet. Op "<a><b>" geeft het patroon <.+> de hele string terug en <.+?> alleen <a>.
Waarom matcht mijn woord binnen andere woorden?
Omdat niets het verankerde. Zet het woord tussen \b — /\bcat\b/ matcht "cat" in "the cat sat" maar niet binnen "concatenate". \b matcht een positie tussen een woordteken en een niet-woordteken, dus het verbruikt niets.
Wat verandert de u-vlag?
Het laat het patroon werken op codepunten in plaats van UTF-16-eenheden, zodat één emoji als één teken telt, en het schakelt \p{…} eigenschap-escapes in zoals \p{L} voor 'elke letter'. Zonder deze vlag blijven \w en \d ASCII-only, en daarom matcht "café" niet volledig op /\w+/.
Wanneer moet ik een niet-vangende groep gebruiken?
Wanneer je de groepering nodig hebt maar niet de gevangen tekst — (?:ab)+ in plaats van (ab)+. Vangsten kosten wat prestatie, maar de echte reden is nummering: elke vangende groep die je toevoegt verschuift de nummers van de groepen erna, waardoor vervangingen die $1 en $2 gebruiken stilletjes breken.
Is lookbehind veilig om te gebruiken?
In huidige browsers en Node wel — (?<=…) en (?<!…) worden sinds 2018 in elke grote engine ondersteund. Safari was de laatste die het toevoegde. Als je zeer oude runtimes wilt bedienen, controleer het dan eerst; er is geen polyfill voor regexsyntaxis.