L’instruction FIND en ABAP est utilisée pour rechercher dans des objets de données de type caractère (variables de type
STRING, C, N, D, T) des chaînes de caractères ou des motifs. C’est un outil très flexible pour l”
analyse de texte et offre deux modes principaux :
- Recherche d’une sous-chaîne fixe : Trouve l’occurrence exacte d’une chaîne de caractères spécifique.
- Recherche par expressions régulières (Regex) : Trouve des motifs décrits par une expression régulière (selon la norme PCRE - Perl Compatible Regular Expressions). Cela permet des recherches beaucoup plus complexes et flexibles.
Syntaxe
La syntaxe varie légèrement selon le mode et les options souhaitées :
1. Structure générale
FIND [{FIRST OCCURRENCE}|{ALL OCCURRENCES OF}] {<substring>}|{REGEX <regex>} IN [SECTION OFFSET <off> LENGTH <len> OF] <data_object> [IGNORING CASE|RESPECTING CASE] " Ignorer/Respecter la casse [MATCH OFFSET <m_off>] " Stocker l'offset trouvé [MATCH LENGTH <m_len>] " Stocker la longueur trouvée [MATCH COUNT <m_cnt>] " Stocker le nombre total (ALL OCCURRENCES uniquement) [RESULTS <result_tab>|<result_wa>] " Stocker les résultats détaillés [SUBMATCHES <sm1> <sm2> ...]. " Stocker les sous-groupes regex2. Syntaxe pour recherche de sous-chaîne
FIND [{FIRST OCCURRENCE}|{ALL OCCURRENCES OF}] <substring> IN <data_object> [<options>]. " par ex. IGNORING CASE, MATCH OFFSET, MATCH LENGTH, MATCH COUNT, RESULTS3. Syntaxe pour expressions régulières (Regex)
FIND [{FIRST OCCURRENCE}|{ALL OCCURRENCES OF}] REGEX <regex> IN <data_object> [<options>]. " par ex. IGNORING CASE, MATCH OFFSET, MATCH LENGTH, MATCH COUNT, RESULTS, SUBMATCHESExplication des composants clés et options
FIND: Le mot-clé qui initie l’instruction.FIRST OCCURRENCE: (Par défaut si non spécifié) Recherche uniquement la première occurrence du motif de gauche à droite.ALL OCCURRENCES: Recherche toutes les occurrences non chevauchantes du motif.<substring>: Une variable ou un littéral avec le texte exact à rechercher (en mode sous-chaîne).REGEX <regex>: Une variable ou un littéral contenant une expression régulière (en mode regex).IN <data_object>: L’objet de données de type caractère (STRING,C,N,D,T) dans lequel effectuer la recherche.IN SECTION OFFSET <off> LENGTH <len> OF: Limite la recherche à une section spécifique dans<data_object>(commençant à l’offset<off>avec longueur<len>; le premier offset est 0).IGNORING CASE: Effectue la recherche sans tenir compte de la casse.RESPECTING CASE: (Par défaut) Effectue la recherche en tenant compte de la casse.MATCH OFFSET <m_off>: Assigne à la variable<m_off>(typeI) l’offset de début (position, base 0) du motif trouvé.MATCH LENGTH <m_len>: Assigne à la variable<m_len>(typeI) la longueur du motif trouvé.MATCH COUNT <m_cnt>: (Uniquement avecALL OCCURRENCES) Assigne à la variable<m_cnt>(typeI) le nombre total de occurrences trouvées.RESULTS <result_tab | result_wa>: Stocke des informations détaillées sur les résultats trouvés.- Avec
ALL OCCURRENCES:<result_tab>(typematch_result_tabou compatible) est rempli avec des informations sur toutes les occurrences (offset, longueur, offsets et longueurs des sous-groupes avec regex). - Avec
FIRST OCCURRENCE:<result_wa>(typematch_resultou compatible) est rempli avec les informations sur la première occurrence.
- Avec
SUBMATCHES <sm1> <sm2> ...: (Uniquement avecREGEX) Si l’expression régulière contient des groupes entre parenthèses (Capture Groups), le texte trouvé par le premier groupe est stocké dans<sm1>, celui du second dans<sm2>etc. ( variables généralement de typeSTRING).
Champs système
sy-subrc : Indique le résultat de la recherche :
0: Succès (au moins une occurrence trouvée).4: Échec (aucune occurrence trouvée).8: Erreur (par ex. regex invalide avec certaines options).sy-fdpos: Contient après une recherche réussie (sy-subrc = 0) l’offset de la dernière occurrence trouvée par rapport au début de<data_object>.
Exemples
1. Trouver la première occurrence d’une sous-chaîne
DATA text TYPE string VALUE `Ceci est un texte d'exemple. Exemplaire!`.DATA position TYPE i.
FIND 'exemple' IN text MATCH OFFSET position.
IF sy-subrc = 0. WRITE: / 'Sous-chaîne "exemple" trouvée à la position (Offset):', position. " Sortie: ... à la position (Offset): 20ELSE. WRITE: / 'Sous-chaîne "exemple" non trouvée.'.ENDIF.2. Compter toutes les occurrences (insensible à la casse)
DATA anzahl TYPE i.
FIND ALL OCCURRENCES OF 'exemple' IN text IGNORING CASE MATCH COUNT anzahl.
IF sy-subrc = 0. WRITE: / '"exemple" (sans tenir compte de la casse) trouvé', anzahl, 'fois.'. " Sortie: ... 2 fois.ENDIF.3. Première occurrence avec Regex (par ex. trouver un nombre)
DATA text2 TYPE string VALUE `Commande 4711 du 20.04.2025 contient 15 positions.`.DATA rx_number TYPE string VALUE `\b\d+\b`. " Regex pour un ou plusieurs chiffres (comme mot)DATA first_num_off TYPE i.DATA first_num_len TYPE i.
FIND REGEX rx_number IN text2 MATCH OFFSET first_num_off MATCH LENGTH first_num_len.
IF sy-subrc = 0. WRITE: / 'Premier nombre trouvé:', text2+first_num_off(first_num_len). " Sortie: 4711 WRITE: / 'À l''offset:', first_num_off, ', Longueur:', first_num_len. " Sortie: À l'offset: 9 , Longueur: 4ENDIF.4. Toutes les occurrences avec Regex et table RESULTS
DATA match_results TYPE match_result_tab.
FIND ALL OCCURRENCES OF REGEX rx_number IN text2 RESULTS match_results.
IF sy-subrc = 0. WRITE: / 'Tous les nombres trouvés:'. LOOP AT match_results INTO DATA(match_line). WRITE: / text2+match_line-offset(match_line-length), '(Offset:', match_line-offset, 'Longueur:', match_line-length, ')'. ENDLOOP. " Sortie: " 4711 (Offset: 9 Longueur: 4 ) " 20 (Offset: 19 Longueur: 2 ) " 04 (Offset: 22 Longueur: 2 ) " 2025 (Offset: 25 Longueur: 4 ) " 15 (Offset: 40 Longueur: 2 )ENDIF.5. Regex avec Submatches (extraire une date)
DATA rx_date TYPE string VALUE `(\d{2})\.(\d{2})\.(\d{4})`. " Groupes pour jour, mois, annéeDATA day TYPE string.DATA month TYPE string.DATA year TYPE string.
FIND REGEX rx_date IN text2 SUBMATCHES day month year.
IF sy-subrc = 0. WRITE: / 'Date trouvée:'. WRITE: / 'Jour:', day, 'Mois:', month, 'Année:', year. " Sortie: Jour: 20 Mois: 04 Année: 2025ENDIF.6. Recherche dans une section
DATA name TYPE c LENGTH 30 VALUE 'Hans Peter Mustermann Berlin'.
FIND 'Peter' IN SECTION OFFSET 5 LENGTH 15 OF name.
IF sy-subrc = 0. WRITE: / '"Peter" trouvé dans la section 5-19, à l''offset:', sy-fdpos. " Sortie: ... à l'offset: 5ELSE. WRITE: / '"Peter" non trouvé dans la section 5-19.'.ENDIF.
FIND 'Berlin' IN SECTION OFFSET 5 LENGTH 15 OF name.IF sy-subrc <> 0. WRITE: / '"Berlin" non trouvé dans la section 5-19.'. " Sortie: "Berlin" non trouvé dans la section ... .ENDIF.Remarques importantes
FINDest conçu pour les objets de données de type caractère.- Les expressions régulières sont extrêmement puissantes, mais leur syntaxe doit être apprise (ABAP utilise PCRE).
- L’ancienne instruction
SEARCHest fonctionnellement très limitée et devrait être remplacée parFIND. - Pour remplacer les motifs trouvés, utilisez l’instruction
REPLACE, qui offre des options de recherche très similaires àFIND.