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/ula finalul expresiei: în JavaScript fără/u,\p{L}este tratat ca literapurmată 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 externpypi/regex). În Python standardre, din fericire,\weste deja Unicode-aware în Python 3, sau poți scrie explicit[a-zA-ZăîâșțĂÎÂȘȚ]+.
Simboluri și rețete înrudite
\w și \W (caractere de cuvânt): Potrivește litere, cifre și caracterul underscore [a-zA-Z0-9_] (\w) sau opusul acestora (\W).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).\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).[abc] și [a-z0-9] (seturi și intervale): Definește o clasă personalizată de caractere din care se potrivește un singur caracter.