> Tech > Utiliser des expressions régulières en RPG

Utiliser des expressions régulières en RPG

Tech - Par Renaud ROSSET - Publié le 24 juin 2010
email

Pour voir comment le langage RPG peut utiliser des expressions régulières, examinons un programme d’affichage simple appelé REGEX (figure 5) qui accepte une expression régulière et une chaîne de texte cible, détermine si elles correspondent, puis renvoie d’éventuels groupes d’expressions régulières. REGEX est très utile pour tester des expressions régulières

Utiliser des expressions régulières en RPG

avant de les incorporer dans votre code. Il démontre aussi comment utiliser des expressions régulières d’une manière plus générale.

Tout d’abord, dites à REGEX où il peut trouver les classes d’expressions régulières Java que vous avez téléchargées, en définissant la variable d’environnement CLASSPATH. La commande AddEnvVar fait cela mais, pour plus de commodité, nous utiliserons le programme CL REGEXC (figure 6), lequel appelle ensuite le processeur principal.

Dans REGEX, nous devons ensuite créer des prototypes pour les méthodes Java que nous utiliserons (figure 7).

Tout comme les ordinateurs ne travaillent pas directement avec le code source mais en utilisent une version compilée, les chaînes de texte représentant des expressions régulières doivent d’abord être compilées dans un format mieux adapté à l’ordinateur. Dans notre cas, le constructeur RE prend une Java String comme paramètre d’entrée et crée une référence vers une expression régulière compilée, par rapport à laquelle nous pouvons rechercher les correspondances avec les chaînes cibles et faire d’autres choses.

Il nous faut aussi déclarer quelques variables de travail Java String (figure 8). La variable incomingRegex est la chaîne de texte qui représente notre expression régulière, qui est comparée à incomingText, et regexGroup est un fragment du texte cible extrait pour notre compte.

Le seul but d’un moteur d’expression régulière est de manipuler des chaînes de caractères. Mais, pour Java et RPG, les chaînes de caractères ne représentent pas du tout les mêmes choses. Une Java String est davantage un objet qu’un type de données primitif, tandis qu’une chaîne RPG est une matrice de caractères EBCDIC. C’est pourquoi REGEX définit certains prototypes pour effectuer la conversion entre les deux (figure 9). Ici, newString prend une matrice de caractères RPG et construit un objet Java String équivalent.

Dans l’autre sens, getBytes prend un objet Java String et renvoie une matrice de caractères RPG.
Après ces préliminaires, nous pouvons entrer dans le vif du sujet.

REGEX est démarré en appelant le programme CL REGEXC à partir de la ligne de commande. REGEX présente ensuite l’affichage que l’on voit figure 5. De la même façon que nous entrons l’expression régulière et le texte qui servira à la comparaison, nous pouvons conditionner le comportement du moteur d’expression régulière de certaines manières. Par défaut, la comparaison est sensible aux majuscules/minuscules, mais nous pouvons établir des conditions pour ignorer la casse, franchir des fins de lignes ou traiter un bloc de texte comme s’il s’agissait d’une seule ligne. Pour obtenir cela, nous ajoutons des valeurs à un paramètre (figure 10) qui sera transmis au compilateur d’expressions régulières.

Aussitôt la touche Entrée enfoncée, REGEX crée d’abord les Java Strings à partir des caractères entrés, en appelant newString() puis définit les indicateurs de conditionnement (figure 11). Ensuite, est créé un objet qui représente une expression régulière compilée, conditionnée par les indicateurs que nous avons définis :

CompiledRegex = RE(incomingRegex : matchedFlags);

Nous pouvons maintenant utiliser l’objet compiledRegex pour tester la correspondance de la variable incomingText (figure 12). La méthode match() renvoie une valeur Boolean selon que incomingText est conforme ou non aux règles de incomingRegex. S’il y a correspondance, un message de réussite est envoyé au sous-fichier de messages. Si incomingRegex a défini des groupes au moyen de parenthèses, ces groupes sont extraits et affichés également. S’il n’y a pas de correspondance, le message approprié est envoyé au sous-fichier de messages.

Pour afficher les messages, REGEX utilise les API de traitement de messages parce qu’elles procurent davantage de souplesse sur des messages codés en dur directement.

Il est intéressant de noter que le prototype pour match() ne définit qu’un paramètre d’entrée – la chaîne (String) que nous voulons tester – alors que l’invocation en utilise deux :

l’objet compiledRegex et la chaîne incomingText. En Java, chaque invocation de méthode contient un premier argument implicite qui fait référence à l’objet manipulé. Quand Java est appelé à partir du RPG, le premier argument doit être rendu explicite. Le fait d’exécuter REGEX avec notre expression régulière e-mail, avec la sensibilité à la case activée (on), crée la correspondance, comme le montre la figure 5. Avant d’accepter l’ensemble suivant de données utilisateur, REGEX nettoie les objets qu’il a créés et les met à la disposition du garbage collection (figure 13).

Comme les méthodes Java peuvent créer des expressions si elles rencontrent un problème, un groupe monitor/ on-error/endmon entoure la plus grande partie du code pour capturer tout ce qui pourrait intéresser l’utilisateur.

Téléchargez cette ressource

Comment lutter contre le Phishing ?

Comment lutter contre le Phishing ?

Dans un environnement cyber en constante mutation, le phishing évolue vers des attaques toujours plus sophistiquées combinant IA, automatisation et industrialisation. Une réalité complexe qui exige des mesures de sécurité avancées et repensées au-delà de l’authentification multifacteur. Découvrez les réponses technologiques préconisées par les experts Eviden et les perspectives associées à leur mise en œuvre.

Tech - Par Renaud ROSSET - Publié le 24 juin 2010