Expresiile regulate au reputația de a arăta ca zgomot aleatoriu. Un model ca ^[\w.-]+@[\w-]+\.\w{2,}$ poate părea ca și cum o pisică ar fi mers pe tastatură. Dar în spatele sintaxei criptice se află o idee remarcabil de elegantă: un limbaj concis pentru descrierea modelelor în text.
Fie că validezi intrări de formular, cauți în fișiere jurnal, cureți date sau faci căutare-și-înlocuire într-o bază de cod, regex este unul dintre cele mai versatile instrumente din trusa unui dezvoltator. Și nu trebuie să memorezi fiecare funcționalitate obscură pentru a obține valoare reală din el. Câteva blocuri de construcție acoperă marea majoritate a cazurilor practice de utilizare.
Ce face de fapt regex
O expresie regulată (regex sau regexp) este un model care descrie un set de șiruri. Îl furnizezi unui motor de căutare — în limbajul tău de programare, editorul de text sau un instrument de linie de comandă — și acesta găsește fiecare șir care se potrivește.
Gândește-te la el ca la o interogare de căutare îmbunătățită:
- Căutare normală: găsește cuvântul exact „error"
- Căutare regex: găsește orice arată ca o adresă IP, o dată, o adresă de email sau orice structură pe care o poți descrie
Regex a fost inventat de matematicianul Stephen Kleene în 1956 și a intrat în informatică prin editoarele de text Unix în anii 1960. Astăzi este suportat în practic toate limbajele de programare și editoarele de text.
Blocurile de construcție
Caractere literale
Cel mai simplu regex este text simplu. Modelul hello se potrivește cu șirul „hello" oriunde apare. Nimic complicat.
Punctul (.) — orice caracter
Un punct se potrivește cu orice singur caracter, cu excepția newline-ului.
h.tse potrivește cu „hat", „hit", „hot", „h3t" și chiar „h t"
Clase de caractere ([])
Parantezele pătrate definesc un set de caractere permise la o poziție.
[aeiou]— orice vocală[0-9]— orice cifră[A-Za-z]— orice literă[^0-9]— orice caracter care NU este o cifră (^în interiorul parantezelor înseamnă „nu")
Clase prescurtate
| Prescurtare | Semnificație | Echivalent |
|---|---|---|
\d |
Orice cifră | [0-9] |
\w |
Caracter de cuvânt | [A-Za-z0-9_] |
\s |
Spațiu | [ \t\n\r] |
\D |
Nu cifră | [^0-9] |
\W |
Nu caracter de cuvânt | [^A-Za-z0-9_] |
\S |
Nu spațiu | [^ \t\n\r] |
Cuantificatori — de câte ori
Cuantificatorii controlează de câte ori trebuie să apară elementul precedent.
| Simbol | Semnificație | Exemplu | Se potrivește |
|---|---|---|---|
* |
Zero sau mai multe | ab*c |
„ac", „abc", „abbc" |
+ |
Unul sau mai multe | ab+c |
„abc", „abbc" (nu „ac") |
? |
Zero sau unu | colou?r |
„color" și „colour" |
{3} |
Exact 3 | \d{3} |
„123", „456" |
{2,4} |
Între 2 și 4 | \d{2,4} |
„12", „123", „1234" |
Ancore — poziție
^— începutul șirului (sau al liniei, cu indicatorulm)$— sfârșitul șirului (sau al liniei)\b— limită de cuvânt
Modelul ^\d{4}$ se potrivește cu un șir care este exact patru cifre, ca „2026", dar nu „abc2026" sau „2026xyz".
Grupuri și alternare
(abc)— captează „abc" ca grupa|b— se potrivește cu „a" sau „b"(cat|dog)— se potrivește cu „cat" sau „dog"
Grupurile îți permit și să aplici cuantificatori la secvențe: (ha)+ se potrivește cu „ha", „haha", „hahaha".
Modele practice comune
Validarea unui email (de bază)
^[\w.-]+@[\w-]+\.\w{2,}$
Aceasta se potrivește cu user@example.com, first.last@company.co.uk (parțial) și respinge șirurile fără @ sau domeniu.
Important: Validarea perfectă a adreselor de email cu regex este notoriu dificilă — specificația completă RFC 5322 este extrem de complexă. Pentru sisteme de producție, folosește un regex de bază pentru verificarea formatului și apoi verifică adresa trimițând un email de confirmare.
Potrivirea unui număr de telefon
\+?\d{1,3}[-.\s]?\(?\d{1,4}\)?[-.\s]?\d{3,4}[-.\s]?\d{3,4}
Aceasta gestionează formate ca +1 555 123 4567, 555-123-4567 și (555) 123-4567.
Potrivirea unui URL
https?://[\w.-]+(/[\w./?&=-]*)?
Se potrivește cu https://example.com, http://example.com/path?q=hello.
Potrivirea unei date (AAAA-LL-ZZ)
\d{4}-\d{2}-\d{2}
Se potrivește cu 2026-03-29, 1999-12-31. Notă: verifică doar formatul, nu validitatea — s-ar potrivi și cu 9999-99-99.
Indicatori care schimbă comportamentul
Majoritatea motoarelor regex suportă indicatori care modifică modul în care este aplicat modelul:
| Indicator | Nume | Efect |
|---|---|---|
g |
Global | Găsește toate potrivirile, nu doar prima |
i |
Insensibil la majuscule | hello se potrivește cu „Hello", „HELLO" etc. |
m |
Multilinie | ^ și $ se potrivesc cu începutul/sfârșitul fiecărei linii |
s |
Dotall | . se potrivește și cu caracterele newline |
În JavaScript, indicatorii sunt adăugați după slash-ul de închidere: /hello/gi. În Python, sunt trimiși ca argumente: re.findall(r"hello", text, re.IGNORECASE).
Când regex este exagerat
Regex este puternic, dar nu este întotdeauna instrumentul potrivit:
- Analiza HTML sau XML. Folosește un parser DOM adecvat. Regex nu poate gestiona fiabil etichetele imbricate.
- Analiza JSON. Folosește
JSON.parse()sau echivalentul. Regex va eșua la cazurile limită. - Validare complexă. Dacă modelul tău ocupă mai multe linii și durează cinci minute să-l citești, consideră scrierea codului de validare procedural.
- Operații simple cu șiruri. Dacă ai nevoie doar de
startsWith(),includes()sausplit(), metodele simple de șiruri sunt mai clare și mai rapide.
Capcane comune
- Uitarea de a escapa caracterele speciale. Punctul
.se potrivește cu orice caracter. Pentru un punct literal, folosește\.. La fel pentru(,),[,],+,*,?,{,},^,$,|și\. - Potrivire lacomă vs. leneșă. Implicit,
.*este lacom — se potrivește cât mai mult posibil. Adaugă?pentru a-l face leneș:.*?se potrivește cât mai puțin posibil. Aceasta contează când extragi conținut între delimitatori. - Backtracking catastrofal. Cuantificatorii imbricați ca
(a+)+pot face motorul să încerce un număr exponențial de căi pe anumite intrări, înghețând programul. Evită repetițiile imbricate pe modele suprapuse. - Uitarea ancorelor. Fără
^și$, modelul tău se potrivește cu subșiruri.\d{3}se potrivește cu „123" în interiorul „abc12345". Folosește^\d{3}$dacă ai nevoie de o potrivire exactă.
Mai departe
Cel mai bun mod de a învăța regex este să experimentezi. Scrie un model, lipește text de test și vezi ce se aprinde. Ajustează și iterează până înțelegi cum funcționează fiecare componentă.
- Cum să testezi modele Regex — tutorial interactiv cu exemple
- Tester Regex — lipește modelul și datele de test, vezi potrivirile evidențiate în timp real
