Een reguliere expressie testen
- Dashboard
- Documentatie
- API
Waar dient een regex-tester voor?
Een regex-tester maakt het mogelijk om te verifiëren dat een reguliere-expressie-patroon (regex)
overeenkomt met de verwachte tekst, zonder de applicatiecode te hoeven uitvoeren. U plakt het patroon, u plakt
de invoertekst, u vinkt de opties aan (flags), en de tool toont onmiddellijk de lijst van gevonden
matches evenals de capture-groepen. Het is het online equivalent van preg_match_all() in PHP, van
String.matchAll() in JavaScript of van re.findall() in Python.
Regexes zijn tegelijk krachtig en verraderlijk. Een komma, een verkeerd geplaatst haakje, een gulzige kwantificator die te veel tekens opslokt: en de geëxtraheerde tekenreeks is niet meer die welke men verwachtte. De tester vermijdt het heen en weer met een editor, een terminal en een testbestand: men itereert het patroon tot men het juiste resultaat ziet.
Hoe schrijf je het patroon?
Voer de regex in zonder de scheidingstekens. Geen /.../, geen #...#.
Om bijvoorbeeld e-mailadressen uit een tekst te halen, voert u alleen
[\w.+-]+@[\w-]+\.[\w.-]+ in. De opties (flags) worden bestuurd door de selectievakjes.
De optie u (Unicode) is standaard aangevinkt. Deze is bijna altijd gewenst: zonder deze
herkent \w geen accenten, en bepaalde patronen geven een stille PCRE-fout terug op
UTF-8-tekenreeksen.
De PCRE-opties
- i (case-insensitive):
[a-z]herkent ook hoofdletters. - m (multiline):
^en$matchen het begin en einde van elke regel, niet meer alleen het begin en einde van de globale tekenreeks. - s (dotall):
.herkent ook regeleinden. Nuttig voor patronen die paragrafen moeten doorkruisen. - u (unicode): interpreteert het patroon en het subject in UTF-8. Onmisbaar zodra de tekst niet-ASCII-tekens bevat (accenten, emoji, ideogrammen).
Voorbeelden van gangbare regexes
- E-mailadres:
[\w.+-]+@[\w-]+\.[\w.-]+(vereenvoudigde vorm, voldoende voor de meeste praktijkgevallen; de strikte RFC 5322 is zeer complex). - HTTP/HTTPS-URL:
https?://[\w.-]+(?:/[\w./?%&=-]*)? - Frans telefoonnummer:
(?:\+33|0)\s?[1-9](?:[\s.-]?\d{2}){4} - Franse postcode:
\b\d{5}\b - ISO-datum (YYYY-MM-DD):
\b\d{4}-\d{2}-\d{2}\b - IPv4-adres:
\b(?:\d{1,3}\.){3}\d{1,3}\b - Heel woord:
\bfoo\b(de word boundaries vermijden omfootballte matchen). - Hashtag:
#\w+ - Semantisch versienummer:
\d+\.\d+\.\d+(?:-[\w.-]+)? - Twitter / X-identifier:
@\w{1,15}
Capture-groepen
Een regex kan groepen tussen haakjes bevatten, die een deel van de match isoleren om opnieuw te gebruiken.
Bijvoorbeeld, het patroon (\w+)@(\w+\.\w+) toegepast op alice@example.com capteert twee
groepen: alice en example.com. De tool toont deze groepen in een
toegewijde kolom, naast elke match. Benoemde groepen ((?P<name>...)) worden ook
opgelijst, geïndexeerd op hun naam.
Om te groeperen zonder te capteren (nuttig om een kwantificator toe te passen zonder de lijst van groepen te
vervuilen), gebruikt men (?:...).
Bescherming tegen ReDoS
De PCRE-engine van PHP kan in catastrophic backtracking raken op bepaalde pathologische patronen:
een patroon zoals (a+)+$ toegepast op een lange niet-beëindigde reeks a kan de
server enkele seconden blokkeren. Om deze denial of service door reguliere expressie
(ReDoS) te vermijden, past de tool twee limieten toe:
- een
set_time_limit(2)aan de worker-kant (de verwerking wordt opgegeven na 2 seconden); - een reductie van
pcre.backtrack_limitnaar 100 000, waardoor patronen die te veel combinaties verkennen snel mislukken.
Bij een te kostbaar patroon toont de tool de PCRE-foutmelding
(preg_last_error_msg()), typisch Backtrack limit was exhausted. Herformuleer uw
patroon met possessieve kwantificatoren (a++) of atomaire groepen
((?>...)) om backtracking te vermijden.
Veelgestelde vragen
Waarom matcht mijn regex niet terwijl het werkt in JavaScript?
De engine van deze tool is PCRE (PHP), dicht bij Perl. De syntaxis is zeer vergelijkbaar met JavaScript maar enkele functies verschillen: lookbehinds met variabele lengte, sommige Unicode-aliassen, of de standaard behandeling van hoofdlettergevoeligheid. Als u van plan bent het patroon aan de browserkant uit te voeren, test dan ook in een JS-omgeving.
Waarom captureert mijn \w geen accenten?
Zonder de flag u herkent \w alleen [A-Za-z0-9_]. Met
u (Unicode) herkent het alle letters volgens UCD, inclusief accenttekens.
Om verder te gaan, gebruik de Unicode-klassen: \p{L} (letter), \p{N}
(cijfer), \p{P} (interpunctie).
Bewaart de tool mijn tekst?
Nee. Het patroon en het subject worden in RAM verwerkt door de PHP-worker, zonder persistentie. Geen ingediende gegevens worden gelogd.
Wat te doen als ik een melding "Backtrack limit was exhausted" krijg?
Uw patroon maakt te veel terugkeren. Zoek de nested quantifiers van het type
(a+)+ of (\w+)*, die typische gevallen van ReDoS zijn. Vervang ze door een
ondubbelzinnige vorm: bijvoorbeeld \w+ in plaats van (\w+)*.
Kan ik een meerregelig patroon testen?
Ja. Vink de optie m aan zodat ^ en $ het begin
en einde van elke regel herkennen. Vink bovendien s aan als u wilt dat . de
regeleinden doorkruist.
Voorbeeldverzoek
curl -X POST https://cdrn.fr/api/v1/tools/regex-tester/execute \
-H "Content-Type: application/json" \
-d '{"pattern":"...","subject":"...","flag_i":false,"flag_m":false,"flag_s":false,"flag_u":true}'
Invoerschema
| Veld | Type | Vereist | Standaard |
|---|---|---|---|
pattern |
string | ✓ | – |
subject |
text | ✓ | – |
flag_i |
boolean | ✓ | false |
flag_m |
boolean | ✓ | false |
flag_s |
boolean | ✓ | false |
flag_u |
boolean | ✓ | true |
Endpoints
GET https://cdrn.fr/api/v1/tools- toont alle beschikbare toolsGET https://cdrn.fr/api/v1/tools/regex-tester- geeft het schema van deze tool terugPOST https://cdrn.fr/api/v1/tools/regex-tester/execute- voert deze tool uit met een JSON-payload