Een reguliere expressie testen

test een reguliere expressie (regex) op een tekst en toont de overeenkomsten en gevangen groepen

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 om football te 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_limit naar 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 tools
  • GET https://cdrn.fr/api/v1/tools/regex-tester - geeft het schema van deze tool terug
  • POST https://cdrn.fr/api/v1/tools/regex-tester/execute - voert deze tool uit met een JSON-payload