REGEX

Învață Expresii Regulare (RegEx): simboluri, cuantificatori și rețete explicate cu exemple

45 de expresii 12 categorii

Expresiile regulate (RegEx / Regular Expressions) reprezintă un formalism matematic și un mini-limbaj declarativ universal folosit în toate limbajele de programare (JavaScript, Python, PHP, C#, Go, Java, Rust) și uneltele de sistem (grep, sed, awk, VS Code) pentru căutarea, validarea, extragerea și înlocuirea șabloanelor complexe de text. Stăpânirea expresiilor regulate este o abilitate fundamentală pentru orice dezvoltator de software și inginer DevOps.

Această secțiune oferă o documentație completă și aprofundată în limba română pentru sintaxa standard **PCRE / ECMAScript**: de la metacaractere de bază, clase de caractere și cuantificatori, până la noțiuni avansate (aserțiuni *lookaround* cu lățime zero, grupuri atomice, cuantificatori posesivi împotriva atacurilor ReDoS, recursivitate și proprietăți Unicode \p{L}), alături de rețete testate de producție.

Arhitectura Motoarelor Regex: DFA (Determinist) vs. NFA (Tradițional cu Backtracking)
// În informatică, există două mari categorii de motoare de expresii regulate:
// 1. Motoare DFA (Deterministic Finite Automaton) - ex: RE2 (Google), Rust regex:
//    - Citesc textul caracter cu caracter o singură dată.
//    - Garantează timp liniar de execuție O(n) raportat la lungimea textului.
//    - IMUNE la atacuri ReDoS (Catastrophic Backtracking)!
//    - Dezavantaj: NU suportă aserțiuni complexe (lookaround) sau referințe inverse (backreferences).

// 2. Motoare NFA (Non-Deterministic Finite Automaton / Backtracking) - ex: PCRE, Python re, JS RegExp:
//    - Explorează șabloanele ghidate de expresie (Regex-directed).
//    - Când o ramură eșuează, motorul face "Backtracking" (se întoarce la ultima bifurcație și încearcă altă variantă).
//    - Suportă funcționalități extrem de puternice: grupuri denumite, lookahead/lookbehind, grupuri atomice.
//    - Pericol: Expresiile prost construite pot suferi de Catastrophic Backtracking (timp de execuție O(2^n))!

Catastrophic Backtracking și Vulnerabilitățile ReDoS

Un atac de tip Regular Expression Denial of Service (ReDoS) exploatează comportamentul de backtracking al motoarelor NFA. Dacă o expresie regulată conține cuantificatori imbricați sau alternări cu suprapunere (de exemplu: (a+)+$ sau (a|a)+$) și este testată pe un șir de intrare care seamănă cu șablonul dar eșuează la ultimul caracter (cum ar fi "aaaaaaaaaaaaaaaaaaaa!"), numărul de permutări verificate de motor explodează exponențial:

  • Pentru 10 caractere: ~1.024 de pași de backtracking.
  • Pentru 25 de caractere: ~33.554.432 de pași (procesorul este blocat la 100% timp de câteva secunde).
  • Pentru 40 de caractere: peste 1 trilion de pași (serverul îngheață complet până la crash!).

Soluția de producție: Evitați suprapunerea cuantificatorilor, folosiți cuantificatori posesivi (++, *+) sau grupuri atomice (?>...) care împiedică motorul să revină înapoi asupra caracterelor deja consumate.

Matricea Flag-urilor Globale (Modificatorii de Comportament)

Flag-urile modifică modul în care motorul interpretează întregul șablon text:

Flag Nume Mod Comportament & Efect Practic
g Global Găsește toate potrivirile din text, nu doar prima apariție (esențial în JavaScript pentru matchAll și replaceAll).
i Case-Insensitive Ignoră diferența dintre majuscule și minuscule (a-z se potrivește și cu A-Z).
m Multiline Schimbă comportamentul ancorelor: ^ și $ se potrivesc la începutul și sfârșitul fiecărei linii individuale (după \n), nu doar al întregului text.
s DotAll / Single-line Forțează metacaracterul punct (.) să se potrivească inclusiv cu caracterele de linie nouă (\n).
u Unicode Activează suportul complet pentru puncte de cod Unicode pe 21 de biți (UTF-8/UTF-16) și permite clasele \p{L}.
x Extended / Verbose Ignoră spațiile albe nespecificate și permite adăugarea de comentarii cu # direct în interiorul expresiei.

Matricea Aserțiunilor Lookaround (Zero-Width Assertions)

Aserțiunile Lookaround verifică dacă un anumit context există înainte sau după poziția curentă, fără a consuma niciun caracter din text (lățime zero). Acest lucru permite aplicarea de condiții multiple simultan sau extragerea valorilor fără delimitatorii adiacenți:

Sintaxă Tip Aserțiune Condiție Verificată Exemplu Practic
(?=...) Positive Lookahead Textul următor trebuie să se potrivească cu șablonul din interior. \d+(?= RON) → găsește cifrele doar dacă sunt urmate imediat de ” RON”, dar extrage DOAR cifrele!
(?!...) Negative Lookahead Textul următor nu are voie să se potrivească cu șablonul. \b(?!admin\b)\w+ → găsește orice cuvânt cu excepția cuvântului „admin”.
(?<=...) Positive Lookbehind Textul precedent trebuie să se potrivească cu șablonul. (?<=\$)\d+ → găsește cifrele precedate de simbolul dolar, dar extrage DOAR cifrele!
(?<!...) Negative Lookbehind Textul precedent nu are voie să se potrivească cu șablonul. (?<!\\)" → găsește ghilimelele care NU sunt escapate cu backslash.

Clase de caractere 7 expresii

Cuantificatori și Backtracking 3 expresii

Grupare și Eficiență 2 expresii

Aserțiuni Avansate 4 expresii

Aserțiuni de Lungime Zero 1 expresie

Cuantificatori (repetiții) 5 expresii

Grupare și Lizibilitate 3 expresii

Aserțiuni de Poziție 2 expresii

Ancore și limite 3 expresii

Grupuri și referințe 4 expresii

Lookaround și flag-uri 4 expresii

Rețete practice și utilizare în limbaje 7 expresii

Toate simbolurile și expresiile RegEx

Lista completă a elementelor explicate în această secțiune, cu sintaxa lor uzuală. Fiecare element are o pagină dedicată, cu explicații detaliate, parametri și exemple practice.

Clase de caractere (6)

Simbol / Expresie Ce face
. (orice caracter) Potrivește orice caracter individual, cu excepția caracterului de linie nouă (newline).
. sau a.b sau /.*$/s
\d și \D (cifre) Scurtătură pentru orice cifră zecimală de la 0 la 9 (\d) sau orice caracter care nu este cifră (\D).
\d | \d+ | \d{4} | \D
\w și \W (caractere de cuvânt) Potrivește litere, cifre și caracterul underscore [a-zA-Z0-9_] (\w) sau opusul acestora (\W).
\w | \w+ | \W
\s și \S (spații albe) Potrivește orice caracter de spațiere: spațiu, tab, linie nouă (\s) sau orice caracter vizibil (\S).
\s | \s+ | \S+ | [\s\S]*
[abc] și [a-z0-9] (seturi și intervale) Definește o clasă personalizată de caractere din care se potrivește un singur caracter.
[aeiou] | [a-zA-Z0-9] | [0-9a-fA-F]
[^...] (set negat) Potrivește orice caracter care NU se află în lista sau intervalul dintre parantezele drepte.
[^abc] | [^0-9] | "[^"]*"

Cuantificatori (repetiții) (5)

Simbol / Expresie Ce face
+ și * (unu sau mai multe / zero sau mai multe) Specifică repetarea elementului precedent de cel puțin o dată (+) sau de zero ori mai multe ori (*).
a+ | a* | \d+ | [a-z]*
? (opțional: 0 sau 1) Marchează elementul precedent ca fiind opțional (poate apărea de 0 ori sau cel mult 1 dată).
a? | https? | (?:ro-)?
{n}, {n,} și {n,m} (număr exact de repetiții) Controlează precis de câte ori trebuie să se repete un caracter sau un grup: exact n, minim n sau între n și m ori.
X{n} | X{n,} | X{n,m}
Greedy vs Lazy (*?, +?, ??) Controlează dacă un cuantificator consumă cât mai mult text posibil (greedy) sau cât mai puțin (lazy / non-greedy).
.*? | .+? | ?? | {n,m}?
\ (escaparea caracterelor speciale) Anulează rolul special al metacaracterelor RegEx (. + * ? ^ $ ( ) [ ] { } | \) pentru a le căuta ca text literal.
\. \? \+ \* \( \) \[ \] \\ \/

Ancore și limite (3)

Simbol / Expresie Ce face
^ și $ (început și sfârșit de șir / linie) Ancorează potrivirea la începutul (^) și/sau la sfârșitul ($) șirului de text sau al fiecărui rând.
^pattern | pattern$ | ^pattern$ | \A...\z
\b și \B (limită de cuvânt) Potrivește poziția de graniță dintre un cuvânt și un non-cuvânt (\b) sau o poziție din interiorul cuvântului (\B).
\bcuvant\b | \bprefix | sufix\b | \B
| (operatorul SAU / alternare) Permite alegerea între două sau mai multe expresii alternative (SAU logic în RegEx).
exp1|exp2 | (?:ro|com|eu) | ^(?:da|nu)$

Grupuri și referințe (4)

Simbol / Expresie Ce face
(...) (grup de captură) Grupează mai multe elemente într-o singură unitate și salvează (capturează) subșirul potrivit pentru extragere sau înlocuire.
(pattern) | (\d{4})-(\d{2})-(\d{2}) | $1, $2
(?:...) (grup fără captură) Grupează elementele pentru aplicarea cuantificatorilor sau a operatorului |, fără a salva subșirul în lista de capturi.
(?:pattern) | (?:http|https):// | (?:\.\d+)?
(?<nume>...) (grup cu nume) Asociază un nume descriptiv unui grup de captură pentru a accesa valoarea extrasă după cheie, nu doar după număr.
(?<nume>pattern) | (?P<nume>pattern) | $<nume>
\1 și \k<nume> (backreference) Refolosește în interiorul aceleiași expresii regulare textul exact care a fost capturat anterior de un grup.
(\w+)\s+\1 | (?<tag>[a-z]+)>.*?</\k<tag>>

Lookaround și flag-uri (4)

Simbol / Expresie Ce face
(?=...) și (?!...) (Positive / Negative Lookahead) Verifică dacă poziția curentă este urmată (?=…) sau NU este urmată (?!…) de un anumit șablon, fără a consuma caracterele.
X(?=Y) | X(?!Y) | ^(?=.*\d)(?=.*[A-Z]).{8,}$
(?<=...) și (?<!...) (Positive / Negative Lookbehind) Verifică dacă poziția curentă este precedată (?<=…) sau NU este precedată (?<!…) de un șablon, fără a-l include în match.
(?<=Y)X | (?<!Y)X
Flag-uri RegEx: g, i, m, s, u, x Modificatori globali care schimbă modul de evaluare a expresiei: căutare multiplă (g), insensibil la majuscule (i), multi-linie (m), Unicode (u).
/pattern/gimu | (?i)pattern | re.IGNORECASE
\p{L} și diacriticele românești (ăîâșț) Potrivește corect toate literele Unicode și diacriticele românești (ă, î, â, ș, ț) folosind proprietăți Unicode sau clase explicite.
/\p{L}+/u | /[a-zA-ZăîâșțĂÎÂȘȚ]+/u

Rețete practice și utilizare în limbaje (4)

Simbol / Expresie Ce face
Rețetă RegEx: Validare Email și URL Expresii regulare practice și sigure pentru validarea și extragerea adreselor de email și a linkurilor HTTP/HTTPS.
/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/
Rețetă RegEx: Telefon RO, CNP și IBAN Șabloane RegEx adaptate pentru România: numere de telefon mobil/fix (+40 / 07xx), Cod Numeric Personal (CNP) și conturi IBAN RO.
/^(?:\+?40|0)\s*7\d{2}[\s.-]?\d{3}[\s.-]?\d{3}$/
Rețetă RegEx: Parolă puternică, cod poștal și IP Expresii regulare pentru verificarea complexității unei parole (cu lookahead), a codurilor poștale de 6 cifre și a adreselor IPv4.
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W_]).{8,}$/
RegEx în JavaScript, PHP (preg_match) și Python (re) Ghid comparativ pentru apelarea expresiilor regulare în cele mai populare 3 limbaje: testare, extragere, înlocuire și split.
str.match(/.../g) | preg_match('/.../', $s, $m) | re.findall(r"...", s)