Waarom uw regex niet matcht: vlaggen, multiline ankers en escape-tekens
Inhoudsopgave
Inhoudsopgave
1. Waarom reguliere expressies vaak onverwacht falen
Reguliere expressies (RegEx) zijn uitzonderlijk krachtig voor patroonherkenning, datavalidatie en teksttransformaties. Toch staat een beroemd programmeurscitaat niet voor niets: "Sommige mensen hebben een probleem en denken: 'Ik weet het, ik gebruik reguliere expressies.' Nu hebben ze twee problemen."
In de praktijk werkt een patroon vaak perfect op een korte teststring, maar weigert het plotseling te matchen zodra er regeleinden, speciale tekens of onverwachte spaties in de productiegegevens voorkomen. Het begrijpen van vlaggen (flags) en ankerpunten lost 90% van deze problemen direct op.
2. Ankers (^) en ($) met en zonder de multiline-vlag (m)
Standaard hebben de ankers ^ (begin) en $ (einde) betrekking op de volledige string als één geheel, ongeacht hoeveel regeleinden (\n) erin staan:
- Zonder de
m-vlag:^abc$matcht alleen als de totale invoertekst precies begint met "abc" en daar direct eindigt. Als "abc" op regel 2 van een lange tekst staat, faalt de match volledig. - Met de
m-vlag (multiline): Zodra u dem-vlag activeert (bijv./^abc$/m), veranderen^en$van betekenis: ze matchen nu aan het begin en einde van elke individuele regel binnen de tekst.
3. De punt (.) en de dotAll-vlag (s): matchen over meerdere regels
Een van de meest hardnekkige misverstanden is de aanname dat het wild-card teken punt (.) letterlijk elk willekeurig teken matcht. In standaard ECMAScript matcht de punt elk teken behalve regeleinden (zoals \n en \r).
Wilt u een HTML-tag over meerdere regels matchen (bijvoorbeeld <div>\n...\n</div>)?
- Traditionele workaround:
[\s\S]*of[\d\D]*om zowel witruimte als niet-witruimte te omvatten. - Moderne oplossing: Gebruik de
s-vlag (dotAll). Met/<div>.*?<\/div>/smatcht de punt gegarandeerd ook regeleinden.
4. Gierige (greedy) versus luie (lazy) kwantoren
Standaard zijn kwantoren zoals *, + en {1,5} gierig (greedy). Dit betekent dat ze proberen zoveel mogelijk karakters te consumeren als grammaticaal mogelijk is:
// Gegeven invoer: "<b>Eerste</b> en <b>Tweede</b>"
// Gierig patroon: /<b>.*<\/b>/
// Matcht ALLES van de eerste <b> tot de ALLERLAATSTE </b>!
// Oplossing: Maak de kwantor lui (lazy) met een vraagteken:
// Lui patroon: /<b>.*?<\/b>/
// Matcht netjes twee afzonderlijke fragmenten: "<b>Eerste</b>" en "<b>Tweede</b>"5. Catastrofale backtracking voorkomen en veilig debuggen
Wanneer u geneste herhalingen gebruikt (zoals (a+)+$ of ([a-zA-Z0-9]+)*=), kan de regex-engine bij een invoer die bijna, maar net niet matcht, exponentieel veel combinaties gaan proberen. Dit staat bekend als catastrophic backtracking en kan een server of browsertabblad binnen seconden volledig laten vastlopen (ReDoS – Regular Expression Denial of Service).
Met de interactieve GoToolstack Regex Tester kunt u patronen veilig lokaal testen en direct inspecteren welke groepen gematcht worden zonder risico voor uw productiesystemen.