\p{L} și diacriticele românești (ăîâșț) în Expresii Regulare (RegEx)

Lookaround și flag-uri PCRE (/u) / ECMAScript (ES2018+ /u)

Potrivește corect toate literele Unicode și diacriticele românești (ă, î, â, ș, ț) folosind proprietăți Unicode sau clase explicite.

Tipar RegEx
/p{L}+/u   |   /[a-zA-ZăîâșțĂÎÂȘȚ]+/u

Ce face \p{L} și diacriticele românești (ăîâșț)

Atunci când prelucrezi texte în limba română, clasele clasice ASCII precum [a-zA-Z], \w sau \b eșuează pe cuvintele care conțin diacritice (ă, î, â, ș, ț și majusculele lor Ă, Î, Â, Ș, Ț). În plus, în textele mai vechi pot apărea și variantele istorice cu sedilă (ş, ţ în loc de virgulă ș, ț).

Soluția modernă în PHP (PCRE) și JavaScript (ES2018+) este activarea flag-ului u (Unicode) împreună cu proprietățile de categorie Unicode: \p{L} potrivește orice literă din orice alfabet (inclusiv toate diacriticele românești, franceze, germane etc.), iar \p{N} potrivește orice caracter numeric.

Variante și sintaxă asociată

Expresie / Simbol Descriere
\p{L} Orice literă Unicode (mică sau mare, inclusiv ă, î, â, ș, ț). Necesită obligatoriu flag-ul /u!
\p{Ll} și \p{Lu} Strict literă mică Unicode (\p{Ll}), respectiv strict majusculă Unicode (\p{Lu}).
\P{L} Orice caracter care NU este o literă Unicode (opusul lui \p{L}).
[a-zA-ZăîâșțĂÎÂȘȚ] Set explicit doar pentru alfabetul român standard (cu virgulă sub ș și ț).
[șşțţ] Set util pentru normalizarea textelor care amestecă ș/ț cu virgulă (corect) și ş/ţ cu sedilă.
(?<!\p{L})...(?<!\p{L}) Limită de cuvânt (\b) sigură pentru limba română în JavaScript și PHP.

Exemple

Exemplul 1: Extragerea tuturor cuvintelor românești dintr-o frază cu \p{L}+

Cu /\p{L}+/gu, toate cuvintele cu diacritice sunt extrase întregi, fără a fi trunchiate.

// JavaScript (sau PHP cu preg_match_all):
const text = "Înțepătura țânțarului a lăsat o urmă roșie pe mână.";
const cuvinte = text.match(/\p{L}+/gu);

Potriviri găsite (Matches)

["Înțepătura", "țânțarului", "a", "lăsat", "o", "urmă", "roșie", "pe", "mână"]

Exemplul 2: Validarea unui nume de persoană în română (cu cratimă și spațiu)

Permitem litere românești separate prin spațiu sau cratimă (ex. Ana-Maria Pătrașcu).

Expresie: /^\p{Lu}\p{Ll}+(?:[- ]\p{Lu}\p{Ll}+)*$/u
Teste:    "Ștefan Gheorghiu", "Ana-Maria Pătrașcu", "ion popescu"

Potriviri găsite (Matches)

"Ștefan Gheorghiu"   -> VALID
"Ana-Maria Pătrașcu" -> VALID
"ion popescu"        -> INVALID (nu începe cu majusculă \p{Lu})

Greșeli frecvente

  • Folosirea lui \p{L} fără flag-ul /u la finalul expresiei: în JavaScript fără /u, \p{L} este tratat ca litera p urmată de {L}, iar în PHP aruncă eroare de compilare PCRE.
  • În modul standard Python re, secvența \p{L} nu este suportată nativ (este suportată doar în pachetul extern pypi/regex). În Python standard re, din fericire, \w este deja Unicode-aware în Python 3, sau poți scrie explicit [a-zA-ZăîâșțĂÎÂȘȚ]+.

Simboluri și rețete înrudite