Reguliere expressies voor mensen: een praktische gids
Reguliere expressies (regex) hebben een imagoprobleem. Ze zien eruit alsof iemand op zijn toetsenbord in slaap is gevallen: ^[\w.-]+@[\w-]+\.[\w.]+$. Ze verschijnen in code-reviews, teksteditors, zoektools en formuliervalidatie. Ontwikkelaars zijn er dol op of vermijden ze volledig.
De waarheid ligt ergens in het midden. Regex is oprecht krachtig. Het is ook oprecht verwarrend in het begin. Maar je hoeft niet elke obscure functie te beheersen om er praktisch nut uit te halen. Een handvol patronen dekt de overgrote meerderheid van praktijkgevallen.
Wat regex eigenlijk doet
Een reguliere expressie is een patroon dat een verzameling strings beschrijft. Je geeft het aan een zoektool en het vindt elke string die overeenkomt met het patroon. Zie het als een zeer precieze zoekopdracht.
Normale zoekopdracht: zoek precies "hallo" Regex-zoekopdracht: zoek alles wat eruitziet als een e-mailadres, een telefoonnummer, een datum, een URL, of elk ander patroon dat je kunt beschrijven.
Wist je dat? Reguliere expressies werden in 1956 uitgevonden door wiskundige Stephen Kleene als een notatie voor het beschrijven van "reguliere talen" in de formele taaltheorie. Ze vonden hun weg naar de informatica via vroege Unix-teksteditors in de jaren 1960 en 1970.
De bouwstenen
Letterlijke tekens
De eenvoudigste regex is gewoon letterlijke tekst. Het patroon hello matcht de string "hello." Niets bijzonders.
De punt (.) — Elk willekeurig teken
Een punt matcht elk willekeurig teken (behalve een nieuwe regel).
h.tmatcht "hat," "hit," "hot," "hut," en zelfs "h3t"
Tekenklassen ([]) — Specifieke tekens
Vierkante haken definiëren een set toegestane tekens op die positie.
[aeiou]matcht elke klinker[0-9]matcht elk cijfer[A-Za-z]matcht elke letter (hoofd- of kleine letter)[^0-9]matcht elk teken dat GEEN cijfer is (de^binnen haken betekent "niet")
Kwantoren — Hoeveel
Deze symbolen regelen herhaling:
| Symbool | Betekenis | Voorbeeld | Matcht |
|---|---|---|---|
* |
Nul of meer | ab*c |
"ac," "abc," "abbc," "abbbc" |
+ |
Een of meer | ab+c |
"abc," "abbc," "abbbc" (niet "ac") |
? |
Nul of een | colou?r |
"color" en "colour" |
{3} |
Precies 3 | a{3} |
"aaa" |
{2,4} |
Tussen 2 en 4 | a{2,4} |
"aa," "aaa," "aaaa" |
Ankers — Positie
^aan het begin betekent "begin van de string"$aan het eind betekent "einde van de string"^hello$matcht alleen de exacte string "hello," niet "say hello" of "hello world"
Afkortingsklassen
Veelgebruikte tekenklassen hebben sneltoetsen:
| Afkorting | Equivalent | Betekenis |
|---|---|---|
\d |
[0-9] |
Elk cijfer |
\w |
[A-Za-z0-9_] |
Elk "woord"-teken |
\s |
[ \t\n\r] |
Elke witruimte |
\D |
[^0-9] |
Elk niet-cijfer |
\W |
[^A-Za-z0-9_] |
Elk niet-woordteken |
\S |
[^ \t\n\r] |
Elke niet-witruimte |
Groepen (()) — Groeperen en vastleggen
Haakjes groeperen delen van een patroon. Dit is nuttig voor het toepassen van kwantoren op een groep of voor het extraheren van specifieke delen van een match.
(ab)+matcht "ab," "abab," "ababab"(\d{3})-(\d{4})matcht "555-1234" en legt "555" en "1234" apart vast
De pipe (|) — Of
De pipe betekent "of."
cat|dogmatcht "cat" of "dog"(jpg|png|gif)matcht elk van deze drie afbeeldingsextensies
Praktische patronen die je vandaag kunt gebruiken
Een e-mailadres matchen (eenvoudig)
[\w.-]+@[\w-]+\.[\w.]+
Ontleding:
[\w.-]+— een of meer woordtekens, punten of koppeltekens (het lokale deel)@— letterlijk @-teken[\w-]+— een of meer woordtekens of koppeltekens (het domein)\.— letterlijke punt (ge-escaped omdat.een speciaal teken is)[\w.]+— een of meer woordtekens of punten (het TLD)
Waarschuwing E-mailvalidatie met regex is berucht moeilijk om perfect te doen. Het eenvoudige patroon hierboven dekt 99% van de echte e-mailadressen, maar verwerkt niet elk randgeval dat in de RFC-specificatie is gedefinieerd. Gebruik voor productievalidatie de e-mailvalidatiebibliotheek van je programmeertaal.
Een telefoonnummer matchen (VS-formaat)
\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}
Dit matcht:
- (555) 123-4567
- 555-123-4567
- 555.123.4567
- 555 123 4567
Een URL matchen
https?://[\w.-]+(/[\w./-]*)?
Dit matcht:
Een datum matchen (JJJJ-MM-DD)
\d{4}-\d{2}-\d{2}
Dit matcht: 2026-03-23, 1999-12-31, etc.
Dubbele woorden vinden
\b(\w+)\s+\1\b
Dit matcht herhaalde woorden zoals "the the" of "is is." De \1 verwijst terug naar wat door de eerste groep is vastgelegd.
Een IPv4-adres matchen
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
Dit matcht patronen zoals 192.168.1.1 of 10.0.0.255.
Tips voor het schrijven van regex
1. Begin eenvoudig, verfijn daarna
Probeer niet bij de eerste poging de perfecte regex te schrijven. Begin met een breed patroon, test het tegen je gegevens en verscherp het.
2. Test altijd
Regex is makkelijk fout te krijgen. Een ontbrekende kwantor of een niet-ge-escapete punt kan volledig veranderen wat er matcht. Test je patroon altijd tegen echte gegevens voordat je het in productie gebruikt.
3. Escape speciale tekens
Als je een letterlijke punt, haakje, vierkant haakje of ander speciaal teken wilt matchen, escape het dan met een backslash: \., \(, \[.
4. Gebruik commentaar en benoemde groepen
Gebruik bij complexe patronen benoemde groepen en commentaar (waar ondersteund) om de regex leesbaar te maken. Je toekomstige zelf zal je dankbaar zijn.
5. Weet wanneer je regex niet moet gebruiken
Regex is het verkeerde gereedschap voor het parsen van HTML, XML, JSON of elke geneste structuur. Gebruik daarvoor een echte parser.
Tip Test en debug je regex-patronen in realtime: Regex-patronen testen. Plak je patroon en testgegevens, en zie matches direct gemarkeerd.
Begin nu met het testen van regex:
Gratis, directe feedback en zonder registratie.