Ga naar inhoud
TextArray

Regex-spiekbriefje

Reguliere expressies zijn compact genoeg zodat de syntaxis gemakkelijker op te zoeken is dan te onthouden. Deze pagina is het geheel op één scherm – klassen, kwantoren, ankers, groepen, lookaround, escape en de vlaggen – met een werkend voorbeeld voor elke rij.

De smaak is JavaScript, wat in uw browser draait en wat de regex-tester op deze site gebruikt. Het meeste is identiek in Python, Java, Go en PCRE; waar smaken uiteenlopen, lopen ze uiteen aan de randen - kijk achter de ondersteuning, syntaxis van benoemde groepen en of \d "ASCII-cijfer" of "een Unicode-cijfer" betekent.

Twee dingen zijn verantwoordelijk voor de meeste verrassingen. Kwantificeerders zijn hebzuchtig: ze nemen alles wat ze kunnen en geven het alleen terug als de rest van het patroon faalt. Daarom slikt <.+> twee tags in en <.+?> niet. En afwisseling is het meest bindend, dus ^a|b$ betekent "begint met a, of eindigt met b" - niet wat de meeste mensen bedoelen als ze het schrijven.

Karakter klassen

De afkortingen zijn alleen ASCII, tenzij u de vlag u toevoegt en Unicode-eigenschaps-escapes gebruikt.

SyntaxisBetekenisVoorbeeld
.Elk teken behalve een regeleindeVoeg de s-vlag toe om deze ook met nieuwe regels te laten overeenkomen./a.c/"abc" → "abc"
\dEen cijfer, 0–9/\d+/"order 42" → "42"
\DAlles wat geen cijfer is/\D+/"42abc" → "abc"
\wLetter, cijfer of onderstrepingstekenAlleen ASCII — "é" is niet \w./\w+/"user_1!" → "user_1"
\WAlles \w komt niet overeen/\W+/"a++b" → "++"
\sElke witruimte, inclusief tabbladen en nieuwe regels/\s+/"a \t b" → " \t "
\SElk teken dat geen witruimte bevat/\S+/" hi" → "hi"
[abc]Elk van de genoemde karakters/[aeiou]/"rhythm and" → "a"
[^abc]Elk teken behalve de vermelde tekens/[^aeiou ]+/"aeiou xyz" → "xyz"
[a-z]Een scala aan karakters/[a-f]+/"zzabcz" → "abc"
\p{L}Elke Unicode-letter (vereist de u-vlag)/\p{L}+/"42 café" → "café"

Kwantificatoren

Deze zijn allemaal van nature hebzuchtig: ze nemen zoveel als ze kunnen en geven alleen terug als de rest van het patroon mislukt.

SyntaxisBetekenisVoorbeeld
*Nul of meer/ab*/"a" → "a"
+Eén of meer/ab+/"abbb" → "abbb"
?Nul of één: 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 – neemt zo min mogelijkDe hebzuchtige <.+> zou beide tags inslikken./<.+?>/"<a><b>" → "<a>"

Ankers en grenzen

Deze komen overeen met een positie, niet met een personage, dus ze verbruiken niets.

SyntaxisBetekenisVoorbeeld
^Begin van de string, of van een lijn 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 het matchen van "cat" binnen "concatenate" verhindert./\bcat\b/"the cat sat" → "cat"
\BGeen woordgrens/\Bcat/"concatenate" → "cat"

Groepen en afwisseling

SyntaxisBetekenisVoorbeeld
(abc)Groep vastleggen - herinnerd voor vervanging/(\d+)-(\d+)/"10-20" → "10-20"
(?:abc)Groeperen zonder vastleggenGebruik dit als u alleen de groepering nodig heeft; het houdt de vastgelegde cijfers betekenisvol./(?:ab)+/"abab" → "abab"
(?<name>…)Genoemde opnamegroep/(?<year>\d{4})/"in 2026" → "2026"
a|bBeide kanten – afwisselingAfwisseling 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"

Kijk rond

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

SyntaxisBetekenisVoorbeeld
(?=…)Vooruitblik – gevolgd door dit/\d+(?= kg)/"80 kg" → "80"
(?!…)Negatieve vooruitblik – niet gevolgd door dit/\d+(?! kg)/"80 lb" → "80"
(?<=…)Kijk achterom – voorafgegaan door dit/(?<=\$)\d+/"costs $40" → "40"
(?<!…)Negatieve lookbehind – niet voorafgegaan door dit/(?<!\$)\b\d+/"about 40" → "40"

Ontsnappen

Deze twaalf karakters zijn degenen die een backslash nodig hebben om letterlijk te worden opgevat.

SyntaxisBetekenisVoorbeeld
\.Een letterlijke stip/\d\.\d/"v2.5" → "2.5"
\\Een letterlijke terugslag/\\/"C:\\dir" → "\\"
\nEen lijnfeed/a\nb/"a\nb" → "a\nb"
\tEen tabblad/a\tb/"a\tb" → "a\tb"
\uFFFFEen teken op basis van zijn codepunt/\u00e9/"café" → "é"

Vlaggen

VlagNaamBetekenis
gGlobaalVind elke match, niet alleen de eerste.
iNegeer casusMatch ongeacht hoofdletters of kleine letters.
mMeerdere regelsZorgt ervoor dat ^ en $ bij elk regeleinde overeenkomen in plaats van alleen aan het einde van de tekenreeks.
sPunt allemaalLaten we. wedstrijdregeleinden ook.
uUnicodeBehandelt het patroon als codepunten en maakt ontsnappingen van de eigenschap \p{...} mogelijk.
yKleverigKomt alleen overeen met precies de laatsteIndex, zoekt nooit vooruit.

FAQ

Wat is het verschil tussen hebzuchtige en luie kwantoren?
Hebzuchtige kwantoren (*, +, {2,}) komen zoveel mogelijk overeen en geven tekens alleen terug als de rest van het patroon niet kan overeenkomen. Toevoegen? maakt ze lui: ze matchen zo min mogelijk en nemen alleen meer als ze gedwongen worden. Op "<a><b>" retourneert het patroon <.+> de hele tekenreeks en <.+?> retourneert alleen <a>.
Waarom komt mijn woord overeen met andere woorden?
Omdat niets het verankerde. Plaats het woord tussen \b — /\bcat\b/ komt overeen met "cat" in "the cat sat" maar niet binnen "samengevoegd". \b komt overeen met een positie tussen een woordteken en een niet-woordteken, dus het verbruikt niets.
Wat verandert de u-vlag?
Het zorgt ervoor dat het patroon werkt op codepunten in plaats van op UTF-16-eenheden, dus een enkele emoji telt als één teken, en maakt ontsnappingen van de eigenschap \p{…} mogelijk, zoals \p{L} voor "elke letter". Zonder dit blijven \w en \d alleen ASCII, wat de reden is dat "café" niet volledig overeenkomt met /\w+/.
Wanneer moet ik een niet-vastleggende groep gebruiken?
Wanneer u de groepering nodig heeft, maar niet de vastgelegde tekst — (?:ab)+ in plaats van (ab)+. Vastleggen kost wat prestatie, maar de echte reden is nummering: elke vastleggroep die je toevoegt, verschuift de nummers van de groepen erna, waardoor vervangingen die $1 en $2 gebruiken stilletjes worden afgebroken.
Is lookbehind veilig te gebruiken?
In de huidige browsers en Node worden ja – (?<=…) en (?<!…) sinds 2018 ondersteund door elke grote engine. Safari was de laatste die dit toevoegde. Als u zich op zeer oude runtimes richt, controleer dan eerst; er is geen polyfill voor regex-syntaxis.