Testovat regulární výraz

testuje regulární výraz (regex) na textu a zobrazuje shody a zachycené skupiny

K čemu slouží regex tester?

Regex tester umožňuje ověřit, že vzor regulárního výrazu (regex) skutečně odpovídá očekávanému textu, bez nutnosti spouštět aplikační kód. Vložíme vzor, vložíme vstupní text, zaškrtneme volby (flags), a nástroj okamžitě zobrazí seznam nalezených shod i zachycené skupiny. Je to online ekvivalent preg_match_all() v PHP, String.matchAll() v JavaScriptu nebo re.findall() v Pythonu.

Regex jsou současně mocné i zrádné. Čárka, špatně umístěná závorka, hladový kvantifikátor, který nasaje příliš znaků: a extrahovaný řetězec už není ten, který se očekával. Tester se vyhýbá tam-zpět s editorem, terminálem a testovacím souborem: iterujeme vzor, dokud nevidíme správný výsledek.

Jak napsat vzor?

Zadejte regex bez delimiterů. Žádné /.../, žádné #...#. Například pro zachycení emailových adres v textu zadejte pouze [\w.+-]+@[\w-]+\.[\w.-]+. Volby (flags) jsou kontrolovány zaškrtávacími poli.

Volba u (Unicode) je defaultně zaškrtnuta. Téměř vždy je žádoucí: bez ní \w nerozpoznává akcenty a některé vzory vrací tichou PCRE chybu na UTF-8 řetězcích.

PCRE volby

  • i (case-insensitive): [a-z] rozpoznává také velká písmena.
  • m (multiline): ^ a $ matchují začátky a konce každého řádku, ne pouze začátek a konec globálního řetězce.
  • s (dotall): . rozpoznává také konce řádků. Užitečné pro vzory, které musí procházet odstavci.
  • u (unicode): interpretuje vzor a subjekt v UTF-8. Nepostradatelné, jakmile text obsahuje ne-ASCII znaky (akcenty, emoji, ideogramy).

Příklady běžných regex

  • Emailová adresa: [\w.+-]+@[\w-]+\.[\w.-]+ (zjednodušená forma, postačující pro většinu praktických případů; striktní RFC 5322 je velmi komplexní).
  • HTTP/HTTPS URL: https?://[\w.-]+(?:/[\w./?%&=-]*)?
  • Francouzské telefonní číslo: (?:\+33|0)\s?[1-9](?:[\s.-]?\d{2}){4}
  • Francouzské PSČ: \b\d{5}\b
  • ISO datum (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í matchování football).
  • Hashtag: #\w+
  • Semver číslo verze: \d+\.\d+\.\d+(?:-[\w.-]+)?
  • Twitter / X identifikátor: @\w{1,15}

Zachycené skupiny

Regex může obsahovat skupiny mezi závorkami, které izolují část matche pro znovupoužití. Například vzor (\w+)@(\w+\.\w+) aplikovaný na alice@example.com zachycuje dvě skupiny: alice a example.com. Nástroj tyto skupiny zobrazuje v dedikovaném sloupci, vedle každého matche. Pojmenované skupiny ((?P<name>...)) jsou také vypsány, indexované svým názvem.

Pro skupinu bez zachycení (užitečné pro aplikaci kvantifikátoru bez znečištění seznamu skupin) používáme (?:...).

Ochrana proti ReDoS

PCRE engine PHP může vstoupit do catastrophic backtracking na některých patologických vzorech: vzor jako (a+)+$ aplikovaný na dlouhý neukončený řetězec a může zablokovat server na několik sekund. Pro vyhnutí se tomuto denial of service regulárním výrazem (ReDoS) nástroj aplikuje dva limity:

  • set_time_limit(2) na straně workeru (zpracování se vzdá po 2 sekundách);
  • snížení pcre.backtrack_limit na 100 000, což rychle selhává vzory, které explorují příliš mnoho kombinací.

V případě příliš nákladného vzoru nástroj zobrazí PCRE chybovou zprávu (preg_last_error_msg()), typicky Backtrack limit was exhausted. Přeformulujte váš vzor použitím possessive kvantifikátorů (a++) nebo atomických skupin ((?>...)) pro vyhnutí se backtrackingu.

Často kladené otázky

Proč můj regex nematchuje, když funguje v JavaScriptu?

Engine tohoto nástroje je PCRE (PHP), blízký Perlu. Syntaxe je velmi podobná JavaScriptu, ale několik funkcionalit se liší: lookbehindy proměnné délky, některé Unicode aliasy, nebo defaultní správa case sensitivity. Pokud chcete spustit vzor na straně prohlížeče, testujte také v JS prostředí.

Proč moje \w nezachycuje akcenty?

Bez flagu u \w rozpoznává pouze [A-Za-z0-9_]. S u (Unicode) rozpoznává všechna písmena ve smyslu UCD, včetně akcentovaných znaků. Pro pokročilejší použijte Unicode třídy: \p{L} (písmeno), \p{N} (číslice), \p{P} (interpunkce).

Uchovává nástroj můj text?

Ne. Vzor a subjekt jsou zpracovány v RAM PHP workerem, bez persistence. Žádná odeslaná data nejsou logována.

Co dělat, pokud dostanu zprávu "Backtrack limit was exhausted"?

Váš vzor dělá příliš mnoho návratů. Hledejte nested kvantifikátory typu (a+)+ nebo (\w+)*, které jsou typickými případy ReDoS. Nahraďte je neambiguní formou: například \w+ místo (\w+)*.

Mohu testovat víceřádkový vzor?

Ano. Zaškrtněte volbu m, aby ^ a $ rozpoznávaly začátky a konce každého řádku. Zaškrtněte navíc s, pokud chcete, aby . procházel zalomeními řádků.

Ukázka požadavku

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é Výchozí
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šechny dostupné nástroje
  • GET https://cdrn.fr/api/v1/tools/regex-tester - získá schéma tohoto nástroje
  • POST https://cdrn.fr/api/v1/tools/regex-tester/execute - spustí tento nástroj s JSON payloadem