REGEXP_REPLACE en Oracle : remplacer avec des regex

REGEXP_REPLACE Oracle : remplacer selon un motif (nettoyer des espaces, reformater un numéro, groupes de capture \1 \2). Syntaxe et exemples pratiques.

Illustration : REGEXP_REPLACE Oracle

REGEXP_REPLACE en Oracle remplace, dans une chaîne, toutes les portions qui correspondent à une expression régulière par un texte de remplacement. C’est la version « surpuissante » de REPLACE : nettoyer des espaces multiples, supprimer des caractères non désirés, reformater des numéros… Voici la syntaxe et des exemples très pratiques.

Publicité

Syntaxe

REGEXP_REPLACE(source, motif [, remplacement [, position [, occurrence [, options]]]])
  • source : la chaîne d’origine.
  • motif : l’expression régulière à rechercher.
  • remplacement : le texte de remplacement (vide par défaut = suppression).

REGEXP_REPLACE vs REPLACE

REPLACE remplace un texte fixe ; REGEXP_REPLACE remplace selon un motif. Pour un remplacement simple, gardez REPLACE (plus rapide).

Exemples indispensables

Réduire les espaces multiples à un seul

SELECT REGEXP_REPLACE('Jean    Pierre   Dupont', ' +', ' ') FROM dual;
-- "Jean Pierre Dupont"

Supprimer tout sauf les chiffres

SELECT REGEXP_REPLACE('+33 (0)6.12.34.56.78', '[^0-9]', '') FROM dual;
-- "330612345678"

Supprimer les caractères non alphanumériques

SELECT REGEXP_REPLACE('Réf: ABC-123!', '[^A-Za-z0-9]', '') FROM dual;
-- "RfABC123"

Utiliser les groupes de capture (backreferences)

Avec des parenthèses dans le motif, on réutilise les parties capturées via \1, \2… dans le remplacement.

-- transformer "Dupont, Jean" en "Jean Dupont"
SELECT REGEXP_REPLACE('Dupont, Jean', '(\w+), (\w+)', '\2 \1') FROM dual;
-- "Jean Dupont"
-- formater un numéro : 0612345678 -> 06 12 34 56 78
SELECT REGEXP_REPLACE('0612345678',
  '(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})', '\1 \2 \3 \4 \5') FROM dual;

Remplacer une occurrence précise / à partir d’une position

-- ne remplacer que la 2ème occurrence de "a" par "X"
SELECT REGEXP_REPLACE('banana', 'a', 'X', 1, 2) FROM dual;  -- "banXna"

Insensible à la casse

SELECT REGEXP_REPLACE('Bonjour BONJOUR', 'bonjour', 'Salut', 1, 0, 'i') FROM dual;
-- "Salut Salut"  (0 = toutes les occurrences)

La famille REGEXP

  • REGEXP_LIKE : tester un motif.
  • REGEXP_SUBSTR : extraire la portion correspondante.
  • REGEXP_REPLACE : remplacer (cette page).
  • REGEXP_INSTR / REGEXP_COUNT : position / nombre d’occurrences.

FAQ

Comment supprimer un motif au lieu de le remplacer ?

Omettez le remplacement (ou mettez une chaîne vide) : REGEXP_REPLACE(col, motif) retire les correspondances.

Que sont \1, \2 dans le remplacement ?

Ce sont les groupes capturés (les parties entre parenthèses du motif). Ils permettent de réorganiser ou reformater le texte.

REGEXP_REPLACE est-il rapide sur de gros volumes ?

Plus coûteux que REPLACE. Pour un remplacement simple et massif, préférez REPLACE ; réservez REGEXP_REPLACE aux motifs réellement complexes.

Un nouveau tutoriel SQL par semaine

Nous ne spammons pas ! Consultez notre politique de confidentialité pour plus d’informations.

Publicité

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Cours SQL & Oracle — 100% gratuitVoir les cours →