Testovať regulárny výraz

testuje regulárny výraz (regex) na texte a zobrazuje zhody a zachytené skupiny

Na čo slúži regex tester?

Regex tester umožňuje overiť, že vzor regulárneho výrazu (regex) skutočne zodpovedá očakávanému textu, bez nutnosti spúšťať aplikačný kód. Vložíme vzor, vložíme vstupný text, zaškrtneme voľby (flags) a nástroj okamžite zobrazí zoznam nájdených zhôd ako aj zachytené skupiny. Je to online ekvivalent preg_match_all() v PHP, String.matchAll() v JavaScripte alebo re.findall() v Pythone.

Regex sú súčasne mocné aj zradné. Čiarka, zle umiestnená zátvorka, hladný kvantifikátor, ktorý nasaje príliš znakov: a extrahovaný reťazec už nie je ten, ktorý sa očakával. Tester sa vyhýba tam-späť s editorom, terminálom a testovacím súborom: iterujeme vzor, kým nevidíme správny výsledok.

Ako napísať vzor?

Zadajte regex bez delimiterov. Žiadne /.../, žiadne #...#. Napríklad na zachytenie emailových adries v texte zadajte iba [\w.+-]+@[\w-]+\.[\w.-]+. Voľby (flags) sú kontrolované zaškrtávacími poľami.

Voľba u (Unicode) je defaultne zaškrtnutá. Takmer vždy je žiadúca: bez nej \w nerozpoznáva akcenty a niektoré vzory vracajú tichú PCRE chybu na UTF-8 reťazcoch.

PCRE voľby

  • i (case-insensitive): [a-z] rozpoznáva aj veľké písmená.
  • m (multiline): ^ a $ matchujú začiatky a konce každého riadku, nielen začiatok a koniec globálneho reťazca.
  • s (dotall): . rozpoznáva aj konce riadkov. Užitočné pre vzory, ktoré musia prechádzať odsekmi.
  • u (unicode): interpretuje vzor a subjekt v UTF-8. Nepostrádateľné, akonáhle text obsahuje ne-ASCII znaky (akcenty, emoji, ideogramy).

Príklady bežných regex

  • Emailová adresa: [\w.+-]+@[\w-]+\.[\w.-]+ (zjednodušená forma, postačujúca pre väčšinu praktických prípadov; striktná RFC 5322 je veľmi komplexná).
  • HTTP/HTTPS URL: https?://[\w.-]+(?:/[\w./?%&=-]*)?
  • Francúzske telefónne číslo: (?:\+33|0)\s?[1-9](?:[\s.-]?\d{2}){4}
  • Francúzske PSČ: \b\d{5}\b
  • ISO dátum (YYYY-MM-DD): \b\d{4}-\d{2}-\d{2}\b
  • IPv4 adresa: \b(?:\d{1,3}\.){3}\d{1,3}\b
  • Celé slovo: \bfoo\b (word boundaries zabraňujú matchovaniu football).
  • Hashtag: #\w+
  • Semver číslo verzie: \d+\.\d+\.\d+(?:-[\w.-]+)?
  • Twitter / X identifikátor: @\w{1,15}

Zachytené skupiny

Regex môže obsahovať skupiny medzi zátvorkami, ktoré izolujú časť matchu na znovupoužitie. Napríklad vzor (\w+)@(\w+\.\w+) aplikovaný na alice@example.com zachytáva dve skupiny: alice a example.com. Nástroj tieto skupiny zobrazuje v dedikovanom stĺpci, vedľa každého matchu. Pomenované skupiny ((?P<name>...)) sú tiež vypísané, indexované svojím názvom.

Pre skupinu bez zachytenia (užitočné na aplikáciu kvantifikátora bez znečistenia zoznamu skupín) používame (?:...).

Ochrana proti ReDoS

PCRE engine PHP môže vstúpiť do catastrophic backtracking na niektorých patologických vzoroch: vzor ako (a+)+$ aplikovaný na dlhý neukončený reťazec a môže zablokovať server na niekoľko sekúnd. Aby sa zabránilo tomuto denial of service regulárnym výrazom (ReDoS), nástroj aplikuje dva limity:

  • set_time_limit(2) na strane workera (spracovanie sa vzdá po 2 sekundách);
  • zníženie pcre.backtrack_limit na 100 000, čo rýchlo zlyháva vzory, ktoré exploruje príliš veľa kombinácií.

V prípade príliš nákladného vzoru nástroj zobrazí PCRE chybovú správu (preg_last_error_msg()), typicky Backtrack limit was exhausted. Preformulujte váš vzor použitím possessive kvantifikátorov (a++) alebo atomických skupín ((?>...)) na vyhýbanie sa backtrackingu.

Často kladené otázky

Prečo môj regex nematchuje, keď funguje v JavaScripte?

Engine tohto nástroja je PCRE (PHP), blízky Perlu. Syntax je veľmi podobná JavaScriptu, ale niekoľko funkcionalít sa líši: lookbehindy premenlivej dĺžky, niektoré Unicode aliasy, alebo defaultná správa case sensitivity. Ak chcete spustiť vzor na strane prehliadača, testujte aj v JS prostredí.

Prečo moje \w nezachytáva akcenty?

Bez flagu u \w rozpoznáva iba [A-Za-z0-9_]. S u (Unicode) rozpoznáva všetky písmená v zmysle UCD, vrátane akcentovaných znakov. Pre pokročilejšie použite Unicode triedy: \p{L} (písmeno), \p{N} (číslica), \p{P} (interpunkcia).

Uchováva nástroj môj text?

Nie. Vzor a subjekt sú spracované v RAM PHP workerom, bez persistencie. Žiadne odoslané dáta nie sú logované.

Čo robiť, ak dostanem správu "Backtrack limit was exhausted"?

Váš vzor robí príliš veľa návratov. Hľadajte nested kvantifikátory typu (a+)+ alebo (\w+)*, ktoré sú typickými prípadmi ReDoS. Nahraďte ich neambiguknou formou: napríklad \w+ namiesto (\w+)*.

Môžem testovať viacriadkový vzor?

Áno. Zaškrtnite voľbu m, aby ^ a $ rozpoznávali začiatky a konce každého riadku. Zaškrtnite navyše s, ak chcete, aby . prechádzal zlomami riadkov.

Ukážka požiadavky

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}'

Vstupná schéma

Pole Typ Povinné Predvolené
pattern string
subject text
flag_i boolean false
flag_m boolean false
flag_s boolean false
flag_u boolean true

Koncové body

  • GET https://cdrn.fr/api/v1/tools - vypíše všetky dostupné nástroje
  • GET https://cdrn.fr/api/v1/tools/regex-tester - získa schému tohto nástroja
  • POST https://cdrn.fr/api/v1/tools/regex-tester/execute - spustí tento nástroj s JSON payloadom