ABAP REPLACE : Remplacer des chaînes de caractères – Avec et sans expressions régulières

Catégorie
ABAP-Statements
Publié
Auteur
Johannes

L’instruction REPLACE en ABAP est utilisée pour trouver des occurrences d’un motif de recherche (soit une chaîne fixe/sous-chaîne, soit un motif défini par une expression régulière) dans un objet de données de type caractère (par ex. STRING, C, N, D, T) et les remplacer par une autre chaîne.

Un aspect important est que REPLACE modifie directement la variable dans laquelle le remplacement est effectué (modification “sur place”).

Syntaxe

REPLACE [{FIRST OCCURRENCE}|{ALL OCCURRENCES OF}] " Que remplacer ? (Premier ou Tous)
{<substring>}|{REGEX <regex>} " Quoi rechercher ? (Texte ou Regex)
IN <variable> " Où chercher/remplacer ? (Sera modifié !)
WITH <remplacement> " Par quoi remplacer ?
[<options>]. " Autres options
  • FIRST OCCURRENCE: Remplace uniquement la première occurrence trouvée du motif de recherche.
  • ALL OCCURRENCES OF (par défaut si FIRST OCCURRENCE est absent): Remplace toutes les occurrences non chevauchantes du motif de recherche.
  • <substring>: Le texte exact (littéral ou variable) à rechercher.
  • REGEX <regex>: Une expression régulière (littéral ou variable, syntaxe PCRE) qui décrit le motif à rechercher. Cela permet une recherche de motif flexible.
  • IN <variable>: La variable de type caractère dont le contenu est recherché et modifié. Attention : Le contenu de cette variable est modifié directement !
  • WITH <remplacement>: La chaîne (littéral ou variable) qui est insérée à la place des motifs de recherche trouvés.
  • <options>: (Sélection)
    • IGNORING CASE / RESPECTING CASE (par défaut): Contrôle si la recherche tient compte de la casse.
    • REPLACEMENT COUNT <nbr>: Stocke le nombre de remplacements effectués dans la variable <nbr> (Type I).
    • REPLACEMENT OFFSET <off>: Stocke l’offset de la position après le dernier remplacement dans <off>.
    • REPLACEMENT LENGTH <len>: Stocke la longueur de la dernière chaîne de remplacement insérée dans <len>.
    • RESULTS <results>: Permet de stocker des informations détaillées sur chaque remplacement (position, longueur, etc.) dans une structure ou table interne (similaire à FIND).
    • IN SECTION OFFSET <sec_off> LENGTH <sec_len> OF: Limite la recherche et le remplacement à une sous-section de la <variable>.

Caractères spéciaux dans le remplacement (<remplacement>) avec REGEX

Lorsque REGEX est utilisé, des caractères de remplacement spéciaux peuvent être utilisés dans la chaîne <remplacement> :

  • $0 ou $&: Représente la totalité de la section de texte trouvée par le regex.
  • $1, $2, $3…: Représente le texte capturé par le premier, deuxième, troisième… groupe entre parenthèses (Capture Group) dans l’expression régulière.
  • ` (Backtick): Représente la partie de la <variable> avant la section de texte trouvée.
  • $': Représente la partie de la <variable> après la section de texte trouvée.
  • $$: Représente un signe dollar littéral ($) dans le texte de remplacement.

Comportement avec longueur fixe (Type C)

Si <variable> est de type C (longueur fixe) :

  • Si le <remplacement> est plus court que le texte trouvé, le reste de l’espace d’origine est complété à droite avec des espaces.
  • Si le <remplacement> est plus long que le texte trouvé et que le résultat dépasse la longueur définie de la variable, le résultat est tronqué à droite. Une perte de données est possible !
  • Recommandation : Pour les remplacements où la longueur peut varier considérablement, l’utilisation d’une variable cible de type STRING est plus sûre.

Champs système

  • sy-subrc:
    • 0: Au moins un remplacement a été effectué.
    • 4: Le motif de recherche n’a pas été trouvé, aucun remplacement n’a eu lieu.
  • sy-fdpos: Contient l’offset de la position après le dernier texte remplacé ou inséré.

Alternatives modernes

Particulièrement pour les variables STRING, l’ABAP moderne offre souvent des alternatives parfois plus lisibles ou qui ne modifient pas la variable d’origine :

  • Fonction replace(...): Retourne une nouvelle chaîne dans laquelle des remplacements ont été effectués.
    DATA(new_string) = replace( val = old_string sub = 'ancien' with = 'nouveau' occ = 0 ). " occ=0 -> tous
  • Templates de chaînes (|...|): Peuvent être utilisés pour des reconstructions plus complexes de chaînes.

REPLACE reste cependant un outil puissant, surtout grâce à l’option REGEX.

Exemples

1. Remplacer la première occurrence

DATA text1 TYPE string VALUE 'Test: Pomme, Poire, Pomme'.
REPLACE FIRST OCCURRENCE OF 'Pomme' IN text1 WITH 'Orange'.
WRITE: / text1. " Sortie: Test: Orange, Poire, Pomme

2. Remplacer toutes les occurrences (Insensible à la casse)

DATA text2 TYPE string VALUE 'Erreur: ERROR Code 1, Error Code 2'.
REPLACE ALL OCCURRENCES OF 'error' IN text2 WITH 'ALERTE' IGNORING CASE.
WRITE: / text2. " Sortie: Erreur: ALERTE Code 1, ALERTE Code 2

3. Compter le nombre de remplacements

DATA text3 TYPE string VALUE 'a b c a b c a'.
DATA count TYPE i.
REPLACE ALL OCCURRENCES OF 'a' IN text3 WITH 'X' REPLACEMENT COUNT count.
WRITE: / text3. " Sortie: X b c X b c X
WRITE: / 'Nombre de remplacements:', count. " Sortie: 3

4. Remplacer avec expression régulière (Espaces multiples -> 1 espace)

DATA text4 TYPE string VALUE 'Mot1 Mot2 Mot3 Mot4'.
REPLACE ALL OCCURRENCES OF REGEX `\s{2,}` IN text4 WITH ` `. " \s{2,} = 2 ou plus d'espaces
WRITE: / text4. " Sortie: Mot1 Mot2 Mot3 Mot4

5. Regex avec groupes de capture (Reformater date YYYYMMDD -> DD.MM.YYYY)

DATA date_in TYPE string VALUE '20250421'.
REPLACE REGEX `(\d{4})(\d{2})(\d{2})` IN date_in WITH '$3.$2.$1'. " $1=YYYY, $2=MM, $3=DD
WRITE: / date_in. " Sortie: 21.04.2025

6. Type C et troncature

DATA text_c TYPE c LENGTH 15 VALUE 'Texte court'.
WRITE: / 'Avant :', |'{ text_c }'|.
REPLACE 'court' IN text_c WITH 'beaucoup plus long'. " Le remplacement est beaucoup plus long
WRITE: / 'Après:', |'{ text_c }'|.

Sortie:

Avant : '{Texte court }"
Après: '{Texte beaucoup }"

(Le remplacement “beaucoup plus long” a été tronqué après “beaucoup ” pour respecter la longueur de champ 15).

Remarques importantes / Bonnes pratiques

  • Rappelez-vous que REPLACE modifie directement la variable. Faites une copie au préalable si nécessaire.
  • Soyez prudent avec REPLACE sur des champs de longueur fixe (Type C), car cela peut entraîner une perte de données par troncature. Utilisez de préférence STRING pour cela.
  • Utilisez l’option REGEX pour des remplacements de motifs flexibles et puissants.
  • Vérifiez sy-subrc après l’instruction pour déterminer si des remplacements ont eu lieu.
  • Considérez la fonction replace(...) et les templates de chaînes comme alternatives modernes, surtout si la valeur originale doit être préservée.