Reguliere expressies hebben de reputatie eruit te zien als willekeurige ruis. Een patroon als ^[\w.-]+@[\w-]+\.\w{2,}$ kan aanvoelen alsof een kat over het toetsenbord heeft gelopen. Maar achter de cryptische syntaxis schuilt een opmerkelijk elegant idee: een beknopte taal om patronen in tekst te beschrijven.
Of je nu formulierinvoer valideert, logbestanden doorzoekt, data opschoont of zoek-en-vervang uitvoert in een codebase, regex is een van de meest veelzijdige tools in de gereedschapskist van een ontwikkelaar. En je hoeft niet elke obscure functie uit je hoofd te kennen om er echt waarde uit te halen. Een handvol bouwstenen dekt de overgrote meerderheid van praktische toepassingen.
Wat regex eigenlijk doet
Een reguliere expressie (regex of regexp) is een patroon dat een verzameling strings beschrijft. Je geeft het aan een zoekmachine — in je programmeertaal, teksteditor of opdrachtregeltool — en het vindt elke overeenkomende string.
Zie het als een verbeterde zoekopdracht:
- Normale zoekopdracht: zoek het exacte woord "error"
- Regex-zoekopdracht: zoek alles wat eruitziet als een IP-adres, een datum, een e-mailadres of elke structuur die je kunt beschrijven
Regex werd uitgevonden door wiskundige Stephen Kleene in 1956 en kwam de informatica binnen via Unix-teksteditors in de jaren 60. Vandaag wordt het ondersteund in vrijwel elke programmeertaal en teksteditor.
De bouwstenen
Letterlijke tekens
De eenvoudigste regex is gewone tekst. Het patroon hello komt overeen met de string "hello" waar het ook voorkomt. Niets bijzonders.
De punt (.) — elk teken
Een punt komt overeen met elk enkel teken behalve een regeleinde.
h.tkomt overeen met "hat", "hit", "hot", "h3t" en zelfs "h t"
Tekenklassen ([])
Vierkante haken definiëren een verzameling toegestane tekens op één positie.
[aeiou]— elke klinker[0-9]— elk cijfer[A-Za-z]— elke letter[^0-9]— elk teken dat GEEN cijfer is (de^binnen haken betekent "niet")
Afkortingsklassen
| Afkorting | Betekenis | Equivalent |
|---|---|---|
\d |
Elk cijfer | [0-9] |
\w |
Woordteken | [A-Za-z0-9_] |
\s |
Witruimte | [ \t\n\r] |
\D |
Geen cijfer | [^0-9] |
\W |
Geen woordteken | [^A-Za-z0-9_] |
\S |
Geen witruimte | [^ \t\n\r] |
Kwantoren — hoeveel
Kwantoren bepalen hoe vaak het voorgaande element moet voorkomen.
| Symbool | Betekenis | Voorbeeld | Komt overeen met |
|---|---|---|---|
* |
Nul of meer | ab*c |
"ac", "abc", "abbc" |
+ |
Eén of meer | ab+c |
"abc", "abbc" (niet "ac") |
? |
Nul of één | colou?r |
"color" en "colour" |
{3} |
Precies 3 | \d{3} |
"123", "456" |
{2,4} |
Tussen 2 en 4 | \d{2,4} |
"12", "123", "1234" |
Ankers — positie
^— begin van de string (of regel, met dem-vlag)$— einde van de string (of regel)\b— woordgrens
Het patroon ^\d{4}$ komt overeen met een string die precies vier cijfers bevat, zoals "2026", maar niet "abc2026" of "2026xyz".
Groepen en alternatie
(abc)— vangt "abc" als een groepa|b— komt overeen met "a" of "b"(cat|dog)— komt overeen met "cat" of "dog"
Groepen laten je ook kwantoren toepassen op reeksen: (ha)+ komt overeen met "ha", "haha", "hahaha".
Veelgebruikte praktische patronen
Een e-mailadres valideren (basis)
^[\w.-]+@[\w-]+\.\w{2,}$
Komt overeen met user@example.com, first.last@company.co.uk (gedeeltelijk), en weigert strings zonder @ of domein.
Belangrijk: E-mailadressen perfect valideren met regex is notoir moeilijk — de volledige RFC 5322-specificatie is extreem complex. Gebruik voor productiesystemen een basis-regex voor formaatcontrole en verifieer het adres vervolgens door een bevestigingsmail te sturen.
Een telefoonnummer matchen
\+?\d{1,3}[-.\s]?\(?\d{1,4}\)?[-.\s]?\d{3,4}[-.\s]?\d{3,4}
Verwerkt formaten zoals +1 555 123 4567, 555-123-4567 en (555) 123-4567.
Een URL matchen
https?://[\w.-]+(/[\w./?&=-]*)?
Komt overeen met https://example.com, http://example.com/path?q=hello.
Een datum matchen (YYYY-MM-DD)
\d{4}-\d{2}-\d{2}
Komt overeen met 2026-03-29, 1999-12-31. Let op: dit controleert alleen het formaat, niet de geldigheid — het zou ook 9999-99-99 matchen.
Vlaggen die het gedrag veranderen
De meeste regex-engines ondersteunen vlaggen die wijzigen hoe het patroon wordt toegepast:
| Vlag | Naam | Effect |
|---|---|---|
g |
Globaal | Vind alle overeenkomsten, niet alleen de eerste |
i |
Hoofdletterongevoelig | hello matcht "Hello", "HELLO", enz. |
m |
Meerdere regels | ^ en $ matchen begin/einde van elke regel |
s |
Dotall | . matcht ook regeleindetekens |
In JavaScript worden vlaggen na de afsluitende slash toegevoegd: /hello/gi. In Python worden ze als argumenten doorgegeven: re.findall(r"hello", text, re.IGNORECASE).
Wanneer regex overdreven is
Regex is krachtig, maar het is niet altijd het juiste gereedschap:
- HTML of XML parsen. Gebruik een echte DOM-parser. Regex kan geneste tags niet betrouwbaar verwerken.
- JSON parsen. Gebruik
JSON.parse()of equivalent. Regex zal falen bij randgevallen. - Complexe validatie. Als je patroon meerdere regels beslaat en vijf minuten kost om te lezen, overweeg dan procedurele validatiecode te schrijven.
- Eenvoudige stringbewerkingen. Als je alleen
startsWith(),includes()ofsplit()nodig hebt, zijn gewone stringmethoden duidelijker en sneller.
Veelvoorkomende valkuilen
- Vergeten speciale tekens te escapen. De punt
.matcht elk teken. Om een letterlijke punt te matchen, gebruik\.. Hetzelfde geldt voor(,),[,],+,*,?,{,},^,$,|en\. - Greedy vs. lazy matching. Standaard is
.*greedy — het matcht zoveel mogelijk. Voeg?toe om het lazy te maken:.*?matcht zo weinig mogelijk. Dit is belangrijk bij het extraheren van inhoud tussen scheidingstekens. - Catastrofale backtracking. Geneste kwantoren zoals
(a+)+kunnen de engine een exponentieel aantal paden laten proberen bij bepaalde invoer, waardoor je programma vastloopt. Vermijd geneste herhalingen op overlappende patronen. - Ankers vergeten. Zonder
^en$matcht je patroon substrings.\d{3}matcht "123" in "abc12345". Gebruik^\d{3}$als je een exacte overeenkomst nodig hebt.
Verder lezen
De beste manier om regex te leren is experimenteren. Typ een patroon, plak wat testtekst en kijk wat oplicht. Pas aan en herhaal totdat je begrijpt hoe elk onderdeel werkt.
- Regex-patronen testen — interactieve tutorial met voorbeelden
- Regex-tester — plak je patroon en testdata, bekijk overeenkomsten in realtime gemarkeerd
