Deși sintaxa de bază a expresiilor regulate pare identică la prima vedere, fiecare limbaj de programare folosește un motor intern cu particularități, extensii și limitări diferite. O expresie regulată care rulează impecabil în PHP sau Java poate arunca o eroare de compilare în JavaScript sau Python, sau poate avea un comportament de performanță complet diferit în Go.
Tabelul Comparativ al Capabilităților pe Motoare
| Funcționalitate | PCRE2 (PHP) | Python (re) | JavaScript (V8) | Go (RE2) |
|---|---|---|---|---|
| Arhitectură Motor | NFA (Backtracking) | NFA (Backtracking) | NFA (Backtracking) | DFA (Liniar O(n)) |
| Imunitate ReDoS | Nu | Nu | Nu | DA (100% garantat) |
| Lookahead (?=…) | Da | Da | Da | NU |
| Lookbehind cu lungime variabilă | Da (limitat) | Nu (doar lungime fixă) | Da (ES2018+) | NU |
| Grupuri Atomice (?>…) | Da | Nu (doar în modulul regex) |
Nu | Nu |
| Cuantificatori Posesivi (++) | Da | Nu (doar în modulul regex) |
Nu | Nu |
| Recursivitate (?R) | Da | Nu (doar în modulul regex) |
Nu | Nu |
| Proprietăți Unicode (\p{L}) | Da | Nu (doar în modulul regex) |
Da (flag-ul u / v) |
Da |
Capcana Grupurilor Denumite (Named Groups)
Sintaxa pentru grupuri cu nume diferă între limbaje, fiind o cauză frecventă de erori la portarea codului:
- Python (modulul standard re): Folosește sintaxa proprietară
(?P<nume>pattern), iar referința inversă este(?P=nume). - JavaScript & PCRE & .NET: Folosesc sintaxa standard
(?<nume>pattern), iar referința inversă este\k<nume>.
De ce a ales Go motorul RE2?
// În limbajul Go (pachetul 'regexp'), Google a ales în mod deliberat să NU folosească un motor NFA.
// Motorul RE2 implementează un automat finit determinist (DFA).
// Avantaj: O interogare pe un server web Go NU poate fi NICIODATĂ blocată de un atac ReDoS!
// Compromis: RE2 nu suportă backreferences sau aserțiuni lookaround.
// Dacă aveți nevoie de lookaround în Go, se folosește o verificare logică manuală în cod!