Testarea unei expresii regulate

testează o expresie regulată (regex) pe un text și afișează potrivirile și grupurile capturate

La ce servește un tester de expresii regulate?

Un regex tester permite să verifici că un model de expresie regulată (regex) corespunde într-adevăr textului așteptat, fără a fi nevoie să lansezi codul aplicativ. Lipești modelul, lipești textul de intrare, bifezi opțiunile (flag-uri), și instrumentul afișează imediat lista corespondențelor găsite precum și grupurile capturate. Este echivalentul online al preg_match_all() în PHP, al String.matchAll() în JavaScript sau al re.findall() în Python.

Regex-urile sunt în același timp puternice și capcanate. O virgulă, o paranteză prost plasată, un cuantificator lacom care aspiră prea multe caractere: și șirul extras nu mai este cel așteptat. Tester-ul evită dus-întorsul cu un editor, un terminal și un fișier de test: iterezi modelul până vezi rezultatul potrivit.

Cum să scrii modelul?

Introdu regex-ul fără delimitatori. Fără /.../, fără #...#. De exemplu, pentru a captura adresele email dintr-un text, introdu doar [\w.+-]+@[\w-]+\.[\w.-]+. Opțiunile (flag-uri) sunt controlate de bifele.

Opțiunea u (Unicode) este bifată implicit. Este aproape întotdeauna dorită: fără ea, \w nu recunoaște diacriticele, și anumite modele returnează o eroare PCRE silențioasă pe șirurile UTF-8.

Opțiunile PCRE

  • i (case-insensitive): [a-z] recunoaște și majusculele.
  • m (multiline): ^ și $ se potrivesc cu începuturile și sfârșiturile fiecărei linii, nu doar începutul și sfârșitul șirului global.
  • s (dotall): . recunoaște și salturile de linie. Util pentru modele care trebuie să traverseze paragrafe.
  • u (unicode): interpretează modelul și subiectul în UTF-8. Indispensabil imediat ce textul conține caractere non-ASCII (diacritice, emoji, ideograme).

Exemple de regex curente

  • Adresă email: [\w.+-]+@[\w-]+\.[\w.-]+ (formă simplificată, suficientă pentru majoritatea cazurilor practice; RFC 5322 strict este foarte complex).
  • URL HTTP/HTTPS: https?://[\w.-]+(?:/[\w./?%&=-]*)?
  • Număr de telefon francez: (?:\+33|0)\s?[1-9](?:[\s.-]?\d{2}){4}
  • Cod poștal francez: \b\d{5}\b
  • Dată ISO (YYYY-MM-DD): \b\d{4}-\d{2}-\d{2}\b
  • Adresă IPv4: \b(?:\d{1,3}\.){3}\d{1,3}\b
  • Cuvânt întreg: \bfoo\b (word boundaries evită potrivirea cu football).
  • Hashtag: #\w+
  • Număr de versiune semantic: \d+\.\d+\.\d+(?:-[\w.-]+)?
  • Identificator Twitter / X: @\w{1,15}

Grupuri capturate

Un regex poate conține grupuri între paranteze, care izolează o porțiune a match-ului pentru a o reutiliza. De exemplu, modelul (\w+)@(\w+\.\w+) aplicat la alice@example.com capturează două grupuri: alice și example.com. Instrumentul afișează aceste grupuri într-o coloană dedicată, alături de fiecare match. Grupurile nume ((?P<name>...)) sunt de asemenea listate, indexate după numele lor.

Pentru a grupa fără a captura (util pentru a aplica un cuantificator fără a polua lista grupurilor), se utilizează (?:...).

Protecție contra ReDoS

Motorul PCRE din PHP poate intra în catastrophic backtracking pe anumite modele patologice: un model precum (a+)+$ aplicat unui șir lung de a neterminat poate bloca serverul pentru mai multe secunde. Pentru a evita acest refuz de serviciu prin expresie regulată (ReDoS), instrumentul aplică două limite:

  • un set_time_limit(2) pe partea worker-ului (procesarea abandonează după 2 secunde);
  • o reducere a pcre.backtrack_limit la 100 000, ceea ce face să eșueze rapid modelele care explorează prea multe combinații.

În caz de model prea costisitor, instrumentul afișează mesajul de eroare PCRE (preg_last_error_msg()), tipic Backtrack limit was exhausted. Reformulează modelul utilizând cuantificatori posesivi (a++) sau grupuri atomice ((?>...)) pentru a evita backtracking-ul.

Întrebări frecvente

De ce regex-ul meu nu se potrivește deși merge în JavaScript?

Motorul acestui instrument este PCRE (PHP), apropiat de Perl. Sintaxa este foarte similară cu JavaScript dar câteva funcționalități diferă: lookbehind-urile de lungime variabilă, anumite alias-uri Unicode, sau gestionarea implicită a sensibilității la majuscule. Dacă numeri să execuți modelul pe partea browserului, testează și într-un mediu JS.

De ce \w nu captează diacriticele?

Fără flag-ul u, \w recunoaște doar [A-Za-z0-9_]. Cu u (Unicode), recunoaște toate literele în sens UCD, inclusiv caracterele cu diacritice. Pentru a merge mai departe, utilizează clasele Unicode: \p{L} (literă), \p{N} (cifră), \p{P} (punctuație).

Păstrează instrumentul textul meu?

Nu. Modelul și subiectul sunt tratate în RAM de worker-ul PHP, fără persistență. Nicio dată trimisă nu este jurnalizată.

Ce să fac dacă primesc un mesaj "Backtrack limit was exhausted"?

Modelul tău face prea multe reveniri înapoi. Caută nested quantifiers de tipul (a+)+ sau (\w+)*, care sunt cazuri tipice de ReDoS. Înlocuiește-le cu o formă neambiguă: de exemplu \w+ în loc de (\w+)*.

Pot testa un model multilinie?

Da. Bifează opțiunea m pentru ca ^ și $ să recunoască începuturile și sfârșiturile fiecărei linii. Bifează în plus s dacă vrei ca . să traverseze salturile de linie.

Exemplu de cerere

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

Schema de intrare

Câmp Tip Obligatoriu Implicit
pattern string
subject text
flag_i boolean false
flag_m boolean false
flag_s boolean false
flag_u boolean true

Puncte de acces

  • GET https://cdrn.fr/api/v1/tools - listează toate instrumentele disponibile
  • GET https://cdrn.fr/api/v1/tools/regex-tester - obține schema acestui instrument
  • POST https://cdrn.fr/api/v1/tools/regex-tester/execute - execută acest instrument cu un payload JSON