> Tech > Expressions régulières en RPG

Expressions régulières en RPG

Tech - Par iTPro.fr - Publié le 24 juin 2010
email

par Craig Caulfield, Mis en ligne le 05/04/2006 - Publié en Octobre 2005

Dans le site où je travaille, nous recevons un fichier ordinaire quotidien de notre banque, contenant les dépôts directs des clients. Nous devons ensuite les imputer à leurs comptes. Les clients donnent l’un parmi plusieurs numéros de référence pour identifier leurs dépôts, mais il n’y a pas de validation au guichet. De ce fait, les numéros de référence se présentent avec ou sans espaces, tirets ou autres caractères, et divers types de formatage.Plutôt que de traiter spécifiquement chaque possibilité, nous utilisons simplement deux expressions régulières pour capturer et envoyer le gros des transactions pour traitement automatique. Nous ne confions au traitement manuel que les transactions non identifiables. Le code de pilotage est serré, élégant et facile à maintenir.

Les développeurs en Linux, Unix et Perl savent depuis longtemps tirer parti de la puissance des expressions régulières. En revanche, le RPG n’a pas d’équivalent et affiche des possibilités de traitement de texte limitées. Mais comme le RPG peut appeler des méthodes Java, on n’a pas vraiment besoin d’une fonction RPG intégrée. Les programmes qui traitent notre fichier bancaire s’inspirent des méthodes de Regexp, une implémentation d’expression Java opensource provenant de l’Apache Software Foundation. On pourrait d’ailleurs utiliser tout aussi bien un certain nom d’autres classes open-source ou commerciales. Regexp n’est qu’un exemple des nombreuses implémentations open-source Java dans lesquelles les développeurs RPG peuvent puiser pour enrichir leurs programmes AS/400 et iSeries.

Donc, cet article a deux objets : généralement, montrer comment RPG peut puiser dans la mine des fonctionnalités offertes par des bibliothèques Java tierce partie et, spécifiquement, démontrer comment une bibliothèque de ce genre peut offrir le traitement d’expressions régulières au RPG.

Une expression régulière est une suite de métacaractères et de littéraux qui, ensemble, décrivent une chaîne de texte cible recherchée. Une expression régulière peut être comparée à un champ, une ligne ou un fichier ; s’il y a correspondance, une certaine action peut s’en suivre. Les métacaractères et littéraux spécifient trois idées de base à propos du texte cible :

  • Les ancres de position (position anchors) spécifient la position d’un ou plusieurs jeux de caractères par rapport à toute la ligne, comme le début d’une ligne.
  • Les jeux de caractères (character sets) correspondent à un certain texte, qui peut être une suite de métacaractères et de littéraux qui correspondent à des caractères individuels ou multiples, ou à leurs combinaisons.
  • Les modificateurs de quantité (quantity modifiers) suivent un jeu de caractères et indiquent le nombre de fois qu’il faut le répéter.

A ce stade, un exemple s’impose. Supposons qu’un utilisateur entre une adresse e-mail et que nous voulions nous assurer qu’il respecte les conventions usuelles (comme un nom local qui pourrait contenir des points imbriqués ou d’autres caractères autorisés, suivis du @, suivis d’une liste de noms d’hôtes et de domaines séparés par des points). Nous pourrions valider une telle adresse au moyen d’une combinaison de fonctions intégrées RPG et d’instructions conditionnelles, ou bien utiliser une expression régulière comme celle-ci :

[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]{2,4}

Au premier coup d’oeil, cette expression a de quoi intimider, mais beaucoup de puissance est condensée dans un petit espace. Pour disséquer cette expression régulière, divisons-la en ses métacaractères et littéraux. (La figure 1 donne une liste des métacaractères et des littéraux avec leurs descriptions.) L’expression régulière ci-dessus trouvera une correspondance avec les adresses e-mail suivantes :

regular_expression@regexp.com
regular%expression@regexp.com
regular.expression@regexp.com
REGULAR_expression@regexp.COM.au
regular-expression@regexp-world.com.au

mais ne trouvera aucune correspondance avec les adresses e-mail du genre

regular$expression@regexp.com
startregular_expression@regexp.comend
L’exemple précédent montre comment utiliser des expressions régulières pour valider des données. En fait, la validation de données n’est que l’une des fonctions confiées aux expressions régulières. Entre autres possibilités, on retiendra : correspondre et extraire, correspondre et remplacer, et décomposer du texte.

Correspondre et extraire. Les expressions régulières peuvent faire deux choses en vérifiant si une chaîne cible a une correspondance et, si oui, en extrayant une sous-chaîne susceptible de nous intéresser : le tout dans une seule instruction.

Ainsi, nous pouvons modifier notre expression régulière de e-mail pour isoler les noms locaux et les noms de domaines :

([A-Z0-9._%-]+)@([A-Z0-9._%-]+\.[A-Z]{2,4})

A noter les parenthèses de part et d’autre des chaînes avant et après le symbole @. Elles définissent des groupes d’expressions régulières ou des parties de la chaîne cible qui ont été capturées et auxquelles on pourra ensuite se référer par le numéro.

Correspondre et remplacer. Avec la méthode subst(), une expression régulière peut reconnaître une séquence dans une chaîne cible, qui sera ensuite remplacée par une autre chaîne donnée quand une correspondance sera trouvée. Pour réaliser la même chose en RPG, il faudrait combiner les fonctions intégrées %scan, %subst et %replace.

Décomposition de texte.

Bien que XML soit en train de devenir la méthode préférée d’échange de données, les fichiers délimités par des virgules et par des tabulations sont encore très présents. Pour traiter ces fichiers en RPG, nous devons balayer pour trouver le caractère délimiteur et compter en chemin pour savoir ce que chaque champ signifie. Avec des expressions régulières, ce traitement est beaucoup plus simple. La méthode split() prend une expression régulière comme argument (lequel peut être tout simplement une virgule ou un caractère de tabulation ou une expression complexe) et, une fois l’expression appliquée à la chaîne cible, renvoie une matrice de chaînes divisées sur les limites des expressions régulières.

La figure 2 montre certains différents métacaractères et littéraux et comment ils coopèrent. (Pour une autre manière d’utiliser des expressions régulières, voir l’encadré « Quelques utilisations sympas des expressions régulières »)

Téléchargez gratuitement cette ressource

IBMi et Cloud : Table ronde Digitale

IBMi et Cloud : Table ronde Digitale

Comment faire évoluer son patrimoine IBMi en le rendant Cloud compatible ? Comment capitaliser sur des bases saines pour un avenir serein ? Faites le point et partagez l'expertise Hardis Group et IBM aux côtés de Florence Devambez, DSI d'Albingia.

Tech - Par iTPro.fr - Publié le 24 juin 2010