Ontwikkelaars

Hoe Test Je een Reguliere Expressie Online (Met Echte Voorbeelden)

8 min leestijd

Je test een reguliere expressie door het patroon te schrijven, de juiste vlaggen te kiezen, het patroon tegen een teststring te draaien en dan zowel de gemarkeerde matches als eventuele vastgelegde groepen te controleren voordat je het patroon in echte code plakt. Dat laatste is waar de meeste bugs vandaan komen: een regex die “er goed uitziet” maar nooit tegen randgevallen is getest, breekt zodra iemand een e-mailadres met een plusje of een pad zonder tweede segment invoert.

Wat het patroon en de vlaggen doen

Een reguliere expressie bestaat uit twee delen: het patroon zelf en een set vlaggen die het gedrag ervan aanpassen. In de widget hieronder typ je het patroon tussen /-scheidingstekens, precies zoals je het in JavaScript zou schrijven, en schakel je de vlaggen los in of uit.

Er zijn vier vlaggen:

  • g (global): zoekt naar elke match in de tekst, niet alleen de eerste. Zonder deze vlag stopt de regex-engine zodra hij één treffer heeft gevonden.
  • i (case-insensitive): negeert het verschil tussen hoofdletters en kleine letters, zodat abc en ABC allebei matchen.
  • m (multiline): verandert wat ^ en $ betekenen. Zonder deze vlag matchen ze alleen het begin en einde van de hele string; met m matchen ze het begin en einde van elke regel apart.
  • s (dotAll): breidt de betekenis van de punt . uit zodat die ook een nieuwe regel (\n) matcht, iets wat een punt normaal gesproken overslaat.

Daarnaast kun je delen van je patroon vastleggen met haakjes (). Alles binnen de haakjes wordt, als het patroon matcht, apart teruggegeven als vastgelegde groep, met index 1 voor de eerste set haakjes, 2 voor de tweede, enzovoort. Wil je een groep een leesbare naam geven in plaats van een nummer, dan gebruik je een benoemde groep zoals (?<year>\d{4}), die dezelfde inhoud vastlegt maar toegankelijk is via year in plaats van via de positie.

Vier patronen om op te oefenen

Onderstaande tabel bevat vier patronen die je in de praktijk vaak tegenkomt: e-mailvalidatie, hexadecimale kleurcodes, een eenvoudig REST-pad en een datumformaat. Kopieer ze naar de tester en probeer je eigen teststrings ertegen.

PatternFlagsMatchesDoesn’t matchCaptures
^[\w.+-]+@[\w-]+\.[a-zA-Z]{2,}$nonejane.doe@example.comjane@example (geen top-level domein)geen
#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})g#2F7BFF, #fff#12G456 (G is geen hexadecimaal teken)Groep 1: 2F7BFF
\/(\w+)\/(\w[\w-]*)g/users/123, /products/abc-456/users (geen tweede segment)Groep 1: resourcetype, Groep 2: id
^\d{4}-\d{2}-\d{2}$none2026-07-1107/11/2026 (verkeerd formaat)geen

Twee van deze patronen verdienen een grondigere blik, omdat ze precies laten zien waarom vlaggen en groepen ertoe doen in de praktijk.

Neem het REST-pad, \/(\w+)\/(\w[\w-]*). De eerste \/ matcht een letterlijke schuine streep (geëscaped, omdat een kale / het patroon zou beëindigen). Daarna volgt (\w+), één of meer woordkarakters, tussen haakjes zodat het als groep wordt vastgelegd: dat is je resourcetype, users of products. Dan weer een \/, gevolgd door (\w[\w-]*): een woordkarakter gevolgd door nul of meer woordkarakters of streepjes, wat toestaat dat een ID als abc-456 in zijn geheel wordt gevangen in plaats van af te breken bij het streepje. Zet je de g-vlag aan en plak je een lijst van API-paden in het testvak, dan krijg je per regel twee groepen terug: het resourcetype en de ID. Dat is precies de bouwsteen voor een routevalidator die controleert of elk binnenkomend pad de vorm /resource/id heeft, en die meteen de twee onderdelen levert om verder te routeren zonder dat je zelf op / hoeft te splitsen.

Het hexadecimale kleurpatroon, #([0-9a-fA-F]{6}|[0-9a-fA-F]{3}), matcht een # gevolgd door precies zes of precies drie hexadecimale tekens, tussen | als twee alternatieven binnen dezelfde groep. De haakjes leggen alleen de tekens ná de # vast, dus Groep 1 van #2F7BFF is 2F7BFF, zonder het hekje. Hier is de g-vlag niet optioneel maar het hele punt van de oefening: stel dat je een CSS-bestand doorzoekt op elke gebruikte merkkleur. Zonder g krijg je alleen de eerste kleurcode die het bestand tegenkomt en stopt de motor daar, ook al staan er verderop nog twintig andere. Met g doorzoekt de engine de volledige tekst en levert hij een lijst van elke match op, met bij elke match de bijbehorende Groep 1-waarde, zodat je in één keer alle merkkleuren uit een stylesheet trekt zonder ze handmatig te doorzoeken.

Probeer het zelf

Plak je eigen patroon en teststring hieronder en zie de matches en groepen direct verschijnen terwijl je typt.

/ /
Regex Tester
Gratis, geen registratie, werkt op elk apparaat.
Open de volledige tool

Veelgemaakte fouten en edge cases

De g-vlag vergeten. Zonder deze stopt de regex na de eerste match, wat stilletjes alles breekt dat elke overeenkomst verwacht, bijvoorbeeld een “alles vervangen”-actie die alleen de allereerste treffer aanpast en de rest ongemoeid laat. Dit is vooral verraderlijk omdat het patroon in een test met één treffer prima lijkt te werken, en pas faalt zodra de echte tekst meer dan één match bevat.

De niet-geëscapete punt. Een niet-geëscapete . komt overeen met elk teken, niet met een letterlijke punt. 192.168.1.1 als patroon komt daardoor ook overeen met 192X168X1X1, wat bij IP-validatie ongeldige invoer stilletjes door de mazen laat glippen. Gebruik \. voor een letterlijke punt, en test expliciet met een string waarin op de puntposities een ander teken staat, om te bevestigen dat je patroon dat wel afwijst.

Hebzuchtige versus luie kwantoren. .* pakt zoveel mogelijk (hebzuchtig), wat ver voorbij het beoogde punt kan gaan: bij het matchen van HTML-tags matcht <.*> op een heel blok niet de eerste < tot de eerstvolgende >, maar de eerste < tot de laatste > in het hele blok, waardoor meerdere tags in één match samensmelten. .*? (lui) stopt op het eerst mogelijke punt, dus <.*?> matcht wel netjes één tag per keer. Het verschil zit hem in één vraagteken, en die ene toets bepaalt of je patroon één element of een half document teruggeeft.

Ontbrekende ankers. Zonder ^ en $ kan een patroon als substring overal in de tekst matchen, dus een “validatie”-patroon zonder ankers kan een string goedkeuren die slechts een geldig deel bevat, waardoor ongeldige invoer erdoorheen glipt. Het datumpatroon uit de tabel hierboven, ^\d{4}-\d{2}-\d{2}$, zou zonder de ankers ook xxx2026-07-11xxx accepteren, want ergens middenin die string zit een geldige reeks van vier cijfers, een streepje, twee cijfers, een streepje en twee cijfers. ^ en $ dwingen af dat de hele string matcht, niet alleen een stukje ervan.

Veelgestelde vragen

Wat is het echte verschil tussen het gebruiken van de g-vlag en het weglaten ervan? Zonder g stopt de regex-engine zodra hij de eerste match heeft gevonden, ongeacht hoeveel andere overeenkomsten er verderop in de tekst staan. Met g blijft de engine doorzoeken tot het einde van de string en verzamelt hij elke match apart, elk met zijn eigen positie en, als het patroon groepen bevat, zijn eigen vastgelegde waarden. Voor een enkele controle (bestaat er een match, ja of nee) maakt het weinig uit, maar voor vervangen, extraheren of tellen is g bijna altijd wat je wilt.

Hoe match ik een letterlijk speciaal teken zoals een punt, dollarteken of haakje? Zet er een backslash voor: \. voor een letterlijke punt, \$ voor een letterlijk dollarteken, \( en \) voor letterlijke haakjes. Dit heet escapen en is nodig omdat die tekens in regex-syntax al een eigen betekenis hebben (de punt matcht elk teken, het dollarteken markeert het einde van de string, haakjes openen een groep). Vergeet je de backslash, dan gedraagt het teken zich als regex-operator in plaats van als het letterlijke teken dat je bedoelde.

Wat is een niet-vastleggende groep, (?:...), en wanneer heb ik die nodig in plaats van een normale (...)-groep? Een niet-vastleggende groep groepeert een deel van het patroon (bijvoorbeeld om er een kwantifier of een alternatief | op toe te passen) zonder dat die inhoud als aparte groep in de resultatenlijst verschijnt. Je gebruikt hem wanneer je de groepering nodig hebt voor de structuur van het patroon, maar niets van de inhoud later wilt opvragen: dat houdt de nummering van je échte, wél vastgelegde groepen overzichtelijk, zonder dat er ongebruikte groepindexen tussen zitten.

Stuurt deze tool mijn patroon of testtekst ergens naartoe? Nee. Alles draait in de browser via de ingebouwde JavaScript RegExp-engine, er wordt niets naar een server gestuurd. Je patroon en teststring verlaten je apparaat niet, wat de tool ook geschikt maakt om te oefenen met gevoelige voorbeeldgegevens.

RegexValidatieOntwikkelaarsReguliere Expressies
Regex Tester
Probeer het nu zelf met de volledige tool.
Nu proberen