Dans le dernier sondage, quelqu'un m'a demandé d'écrire à propos des expressions régulières. J'avais prévu d'écrire un jour ou l'autre à ce sujet, ça m'a donc motivé. Je suis allé dépoussiérer un vieux code que j'ai remis au goût du jour et me voilà pour vous parler des expressions régulières.

Les devises Shadok

Les expressions régulières, kesako ?

^[a-zA-Z-_][email protected][a-zA-Z-_]+\.[a-zA-Z_-]{2,6}$
^[0-9]{2}[/-.][0-9]{2}[/-.][0-9]{4}$

Si c'est la première fois que vous voyez un code de ce genre, ne paniquez pas. Cela peut paraître très compliqué, mais ça ne l'est pas tant que ça (un peu quand même). Je vous présente deux expressions régulières. La première permet de vérifier qu'une adresse mail est valide, la seconde permet de contrôler une date.

C'est un outil très puissant qui permet d'analyser et d'extraire des informations depuis une chaîne de caractère. Si la fonction Position de WinDev est un vélo, les expressions régulières sont un TGV.

On peut s'en servir pour contrôler la saisie sur des zones où la structure de la chaîne est importante, on peut aussi les utiliser pour parser un texte. Bref, c'est un outil très pratique, mais il paraît tellement compliqué que certains développeurs préfèrent vivre sans (c'est possible, mais c'est dommage).

Comment WinDev gère les expressions régulières

WinDev® propose une et une seule fonction pour traiter les expressions régulières : VérifieExpressionRégulière (Je vous laisse lire la documentation et revenir ici, on a encore du travail).

Mais il y a un problème avec cette fonction. C'est que je n'ai pas réussi à déterminer quelle norme elle utilise pour gérer les expressions régulières. Il faut savoir qu'il existe plusieurs normes et chacune a ses spécificités. Pour ma part, je suis habitué à la norme qui vient de Perl. Vous trouverez un petit listing sur Wikipedia.

J'avais donc écrit il y a quelques années une fonction qui me permettait de me rapprocher de la norme définie par Perl. Mais pour vous, Je l'ai remise au goût du jour et la voici, flambant neuve.

Voici la procédure RegExp qui a la même syntaxe que VérifieExpressionRégulière :

PROCEDURE RegExp(Expression est une chaîne, LOCAL Format est une chaîne, *)
    Format = TraduireRegExpPerlVersRegExpWd(Format)
    QUAND EXCEPTION DANS
        RENVOYER VérifieExpressionRégulière(Expression, Format, MesParamètres[3 A ])
    FAIRE
        RENVOYER Faux
    FIN

Et la procédure TraduireRegExpPerlVersRegExpWd.

PROCEDURE TraduireRegExpPerlVersRegExpWd(LOCAL Format est une chaîne)

Format = (Gauche(Format, 1) = "^") ? Format[[2 A ]] SINON ".*" + Format
Format = (Droite(Format, 1) = "$") ? Format[[1 A Taille(Format) - 1]] SINON Format + ".*"

tElements est un tableau de chaîne = ["", "", Format]
Format = ""
TANTQUE VérifieExpressionRégulière(tElements[3],"([^\]*)(\\.)(.*)", tElements)
    Format += tElements[1] + iTraduire(tElements[2])
FIN

Format += tElements[3]
RENVOYER Format

    PROCEDURE INTERNE iTraduire(LOCAL ElementATraduire est chaîne)
        SELON ElementATraduire
            CAS "\d" : RENVOYER "[0-9]"
            CAS "\D" : RENVOYER "[^0-9]"
            CAS "\t" : RENVOYER TAB
            CAS "\n" : RENVOYER RC
            CAS "\s" : RENVOYER "[" + RC + TAB + " ]"
            CAS "\S" : RENVOYER "[^" + RC + TAB + " ]"

            AUTRE CAS : RENVOYER ElementATraduire
        FIN
    FIN

Enfin, sachez qu'il y a d'autres méthodes pour gérer les expressions régulières dans WinDev. Cependant, cela implique d'avoir des dépendances avec d'autres langages, et à force de me lire, vous devez le savoir, je n'aime pas les dépendances. Mais cela n'engage que moi, je vous mets donc un lien vers le forum de PCSoft® : Expressions régulières, regex, cherche et remplace (Merci aux contributeurs de ce post). Je l'ai testé il y a des années, mais l'outil du vbscript marchait bien à l'époque.

Je vous apprendrai dans un prochain billet à utiliser les expressions régulières. Il nous reste à apprendre les bases des expressions régulières ainsi que les options de capture. Mais il y a tant à dire que je pourrais y consacrer tous les articles de ce blog. En attendant, n'hésitez pas à poser vos questions par commentaire, ça me permettra de savoir ce que devra contenir le prochain billet.

Code source et exemple complet de ce billet

Comme d'habitude, je met à disposition de mes abonnés le projet complet qui m'a permis de mettre en place l'exemple.

Ce projet contient :

  • la collection de procédures yChaine qui contient les procédures RegExp et TraduireRegExpPerlVersRegExpWd ;
  • les tests unitaires qui m'ont permis de développer les deux procédures et qui donnent quelques exemples d'expressions régulières.

Le projet est stocké dans le dossier :

  • 2017-11-19 Expression reguliere.

Si ce n'est pas encore le cas, abonnez-vous et récupérez l'exemple gratuitement.

Résumé du billet

Nous avons vu dans ce billet une courte présentation des expressions régulières. Il existe plusieurs normes et WinDev semble avoir sa propre norme. Afin d'avoir une version plus standard, j'en encapsulé l'utilisation de VérifieExpressionRégulière dans une fonction regexp qui se rapproche de la norme Perl.
Enfin, je propose aux abonnés un projet contenant le code source de l'article.

Conclusion

Je pensais faire un seul article sur les expressions régulières, mais le chantier est vraiment vaste. J'ai donc décidé de vous donner avant tout un outil car il est toujours possible d'apprendre à utiliser les expressions régulières depuis un autre site.

J'essaierai quand même de produire un autre billet qui sera une introduction aux expressions régulières dans WinDev.

Je surveille les commentaires, si vous avez des questions sur les expressions régulières, je me ferai un plaisir de vous répondre.

Si vous avez des expressions régulières que vous utilisez souvent, je vous invite à les partager avec les autres lecteurs.

Je vous remercie pour votre attention et j'espère que vous avez apprécié l'article.

Bonne journée à vous.

Jonathan Laurent

Read more posts about this author.

Comments