Wat betekent « een reguliere expressie testen »?
Een reguliere expressie testen (« regex test online », « regex testen javascript ») betekent een patroon uitvoeren tegen echte tekst en precies zien wat de engine teruggeeft: de gevonden tekenreeksen, hun positie en de waarde van de vastleggroepen. Een patroon dat « klopt » zegt niets zolang het niet op jouw gegevens heeft gedraaid — dat is het enige verschil dat telt tussen de regex uit de tutorial en de regex in productie.
De test beantwoordt drie verschillende vragen. Of het matcht : de overeenkomstentabel zegt het in de eerste regel. Waar en hoe vaak : index en lengte tonen of het anker op de juiste plek zat. Wat het vastlegt : de genummerde of benoemde groepen laten zien of het deel dat je wilde extraheren daadwerkelijk het juiste is.
De metatekens die het verschil maken
Het punt . vervangt elk teken behalve een nieuwe regel — vandaar de vlag s wanneer je tekst uit meerdere regels bestaat. De kwantificeerders *, + en ? zijn gulzig : ze stoppen bij het eerste aantal herhalingen dat volstaat. Het achtervoegsel ? (*?, +?, {2,5}?) keert dit gedrag om en levert de luie versie, die je bijna altijd moet kiezen wanneer een .* het einde van de regel opslikt.
De haken definiëren een klasse: [abc] accepteert een teken uit de lijst, [^abc] alles behalve die, [a-z0-9] een bereik. Let op de negatie aan het begin van de klasse — [^...] alleen voor de eerste positie, anders ^ weer letterlijk wordt. De pipe | scheidt alternatieven en gedraagt zich als lage prioriteit: ^cat|dog$ betekent « de hele tekst is cat » of « de hele tekst is dog », niet « cat of dog aan begin of einde » — dan moet je groeperen: ^(?:cat|dog)$.
Groepen, lookahead en lookbehind
Haakjes leggen vast. Groep 1 is bereikbaar met $1 aan de vervangingskant en \1 aan de patroonkant, benoemde groepen met $<nom> en \k<nom> — veel leesbaarder vanaf drie groepen. (?:...) groepeert zonder een nummer aan te maken, wat je kie zodra je alleen voor de structuur vastlegt.
De asserties (lookaround) controleren zonder te verbruiken: (?=...) eist dat wat volgt overeenkomt, (?!...) verbiedt dat, (?<=...) en (?<!...) doen hetzelfde voor wat eraan voorafgaat. Zo dwing je een speciaal teken af in een wachtwoord zonder het in de vastlegging op te nemen: ^(?=.*\d)(?=.*[A-Z]).{12,}$.
ReDoS: wanneer de regex een tijdbom wordt
De ReDoS (Regular Expression Denial of Service) komt van het backtracking : bij een bijna passende invoer onderzoekt een patroon als (a+)+$ alle manieren om de « a » te knippen voordat het faalt, en het aantal explosies groeit exponentieel. Twee vuistregels: test het patroon op een realistisch volume — het tabblad Prestaties doet dat voor je — en laat nooit een niet-doorgelichte regex draaien op een invoer van buitenaf zonder groottebeperking. Op een server bevriest een geblokkeerde regex een hele worker tot de timeout afloopt.
JavaScript, PCRE, Python: dezelfde basis, kleine verschillen
De tester gebruikt de native engine van de browser, oftewel ECMAScript. De basissyntaxen — klassen, kwantificeerders, groepen, lookahead, vlaggen g i m s u y — zijn gemeenschappelijk voor PCRE (PHP, Perl), voor Python met re, voor Java en Go. De verschillen zitten vooral in het lookbehind (lang afwezig in JavaScript, inmiddels ondersteund), in de Unicode-eigenschappen en in vlaggen in het patroon als (?i), die alleen PCRE eigen zijn. Een patroon van de ene naar de andere taal overbrengen blijft dus een kwestie van details — geen uitvindingswerk.
Aanbevolen voor
Frontend- en backendontwikkelaars (formuliervalidatie, logparse, datamigratie), ops en DevOps (configuratiefilters, WAF-regels), testers en analisten (kolomextractie, formatcontrole), redacteuren en data-analisten (bestanden opschonen), studenten (metatekens begrijpen) en iedereen die een reguliere expressie snel, volledig en vertrouwelijk wil testen — met als aanvulling de JSON-formatter, de URL-encoder en -decoder, de Base64-encoder en -decoder en de JWT-encoder en -decoder.