Diferențele dintre Motoarele Regex: PCRE (PHP), Python (re), JavaScript RegExp și Go (RE2) în Expresii Regulare (RegEx)

Ghid comparativ al motoarelor de expresii regulate: diferențele de sintaxă și capabilități între PCRE (PHP), Python re, JavaScript V8 RegExp și Go RE2.

Tipar RegEx
PCRE vs Python re vs JS RegExp vs Go RE2

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!