regexp_replace în PostgreSQL

Funcții pentru text PostgreSQL 8.1+ (parametrii start și N: 15+)

Înlocuiește într-un text porțiunile care se potrivesc unei expresii regulate. Cu flagul 'g' le înlocuiește pe toate.

Sintaxă SQL
regexp_replace(text, model, inlocuire [, flaguri])
regexp_replace(text, model, inlocuire, start [, N [, flaguri]])   -- PostgreSQL 15+

Ce face regexp_replace

regexp_replace caută în text modelul (o expresie regulată POSIX) și îl înlocuiește. Implicit înlocuiește doar prima potrivire; flagul 'g' (global) le înlocuiește pe toate, iar 'i' ignoră diferența dintre litere mari și mici.

În textul de înlocuire, \1, \2 etc. înseamnă grupurile din paranteze, iar \& întreaga potrivire.

Din PostgreSQL 15 există și regexp_count, regexp_like, regexp_substr și regexp_instr, iar regexp_replace poate înlocui doar a N-a potrivire.

Parametri

Parametru Descriere
text Textul prelucrat.
model Expresia regulată, de exemplu '\s+'.
inlocuire Textul nou; poate conține \1…\9.
flaguri 'g' = toate potrivirile, 'i' = fără diferență de majuscule.

Ce returnează

Textul după înlocuire (text).

Exemple

Exemplul 1: Curățarea numerelor de telefon

SELECT telefon, regexp_replace(telefon, '\D', '', 'g') AS doar_cifre
FROM clienti;

Rezultat în psql

     telefon     | doar_cifre  
-----------------+-------------
 0722 123 456    | 0722123456
 (0232) 21-45-67 | 0232214567
 +40 745.111.222 | 40745111222
(3 rows)

Exemplul 2: Fără ‘g’ se înlocuiește doar prima potrivire

SELECT regexp_replace('Ana   are    mere', '\s+', ' ') AS prima,
       regexp_replace('Ana   are    mere', '\s+', ' ', 'g') AS toate;

Rezultat în psql

      prima      |    toate     
-----------------+--------------
 Ana are    mere | Ana are mere
(1 row)

Exemplul 3: Grupuri: data din format ISO în format românesc

SELECT regexp_replace('2026-10-25', '(\d{4})-(\d{2})-(\d{2})', '\3.\2.\1') AS data_ro;

Rezultat în psql

  data_ro   
------------
 25.10.2026
(1 row)

Greșeli frecvente

  • Uiți flagul 'g' și se înlocuiește doar prima apariție.
  • Folosești regexp_replace pentru un text fix: replace(text, 'vechi', 'nou') este mai simplu și nu interpretează caractere speciale ca . sau (.

Comenzi înrudite

  • split_part și string_to_array: split_part returnează bucata n dintr-un text împărțit după separator; string_to_array returnează toate bucățile ca tablou.
  • format: Construiește un text dintr-un șablon cu %s, %I și %L. Este modul sigur de a crea SQL dinamic în PL/pgSQL.