. (orice caracter) în Expresii Regulare (RegEx)

Clase de caractere PCRE / ECMAScript / POSIX

Potrivește orice caracter individual, cu excepția caracterului de linie nouă (newline).

Tipar RegEx
.   sau   a.b   sau   /.*$/s

Ce face . (orice caracter)

În expresiile regulare, punctul (.) este metacaracterul universal (wildcard) care potrivește orice caracter individual: litere, cifre, semne de punctuație, spații sau simboluri speciale. Singura excepție implicită este caracterul de linie nouă (\n și, în multe motoare, \r).

Pentru că punctul are această semnificație specială, ori de câte ori vrei să cauți un punct literal (de exemplu într-o adresă de email, un domeniu .ro sau un număr zecimal 3.14), trebuie să îl escapezi cu backslash: \.. Dacă vrei ca punctul să potrivească inclusiv trecerile pe linie nouă, activează flag-ul s (dotAll / singleline).

Variante și sintaxă asociată

Expresie / Simbol Descriere
. Potrivește orice caracter (literă, cifră, spațiu, simbol), mai puțin newline (\n).
\. Potrivește caracterul punct literal („.”), anulând comportamentul de wildcard.
[.] Punct în interiorul unui set de caractere; este tratat tot ca punct literal.
.* Zero sau mai multe caractere de orice fel pe aceeași linie (cuantificare greedy).
.*? Zero sau mai multe caractere în mod non-greedy (lazy), oprindu-se la prima potrivire.
/.../s Cu flag-ul s (dotAll), punctul potrivește absolut orice caracter, inclusiv \n.

Exemple

Exemplul 1: Potrivirea unui caracter arbitrar între două litere

Șablonul c.t cere litera c, urmată de exact un caracter de orice fel, urmată de t.

Expresie: /c.t/g
Text:     "cat, cot, cut, c9t, c-t, ct, cart"

Potriviri găsite (Matches)

Match 1: "cat"
Match 2: "cot"
Match 3: "cut"
Match 4: "c9t"
Match 5: "c-t"
(nu potrivește "ct" fiindcă lipsește caracterul din mijloc, nici "cart" care are 2 caractere între c și t)

Exemplul 2: Diferența dintre . (wildcard) și \. (punct literal) la fișiere

Dacă nu escapăm punctul în fisier.txt, expresia va potrivi și fisierXtxt.

Expresie greșită: /raport.pdf/g
Expresie corectă: /raport\.pdf/g
Text:             "Am descărcat raport.pdf și raport_pdf din arhivă."

Potriviri găsite (Matches)

Cu /raport.pdf/g  -> potrivește AMBELE: "raport.pdf" și "raport_pdf"
Cu /raport\.pdf/g -> potrivește DOAR:   "raport.pdf"

Greșeli frecvente

  • Uitarea escapării punctului (. în loc de \.) în validări de domenii sau extensii de fișiere: /dexblog.ro/ acceptă și dexblogXro.
  • Folosirea lui .* pentru a extrage text dintre două delimitatori (ex. <p>.*</p>), care din cauza comportamentului greedy va înghiți totul de la primul <p> până la ultimul </p> din pagină.
  • Presupunerea că .* trece pe rândul următor fără a activa flag-ul s (sau fără a folosi [\s\S]*).

Simboluri și rețete înrudite