[VBA] Expressions régulières - Patterns pour RegExp

JNP

XLDnaute Barbatruc
1 - INTRODUCTION

1.1 - Pré-requis :

Fil pour les échanges sur ce tuto :
Expressions régulières - Patterns pour RegExp

Utilisation :
VBA – Fonctions personnalisées de feuilles

Niveau :
Moyen – Expert
(pour les débutants, un certain nombre de fonctions sont disponibles mais la confection de Pattern peut être ardue :rolleyes:...)

1.2 - Présentation :

Intérêt :
Les expressions régulières sont une technique pour effectuer des recherches dans le texte suivant un schéma (motif) ou une chaîne de caractères. Ils peuvent permettre aussi bien de compter les occurrences d’un motif que de les remplacer ou les extraire. La vérification permet aussi des masques complexes.

Fichier attaché :
Lien supprimé - Ensembles de Patterns issus de fils de ce forum, de propositions des forumeurs, etc., assorti d’une fonction de contrôle de la validité du Pattern, en version unique ou multiple, ainsi qu’un lexique (que j’espère exhaustif :eek:) des caractères utilisés pour la création des Patterns ainsi que les métacaractères et les opérateurs. Ce fichier est appelé à être mis à jour au fur et à mesure de vos contributions :).

Petit glossaire ;) :
Pattern : Motif servant à la comparaison.
Global : Booléen permettant 1 occurrence ou plusieurs. Global = True va renvoyer (comme une boucle Find et FindNext) l'ensemble des résultats trouvés dans un tableau. Global = False renverra la première occurrence trouvée et arrêtera la recherche.
Test : Fonction de vérification de la présence du Pattern (retourne un booléen).
Replace : Remplace les motifs trouvés par la chaîne indiquée.
Execute : Renvoie les résultats de la recherche dans un tableau.

1.3 - Liens utiles :

Liens extérieurs :
Tutoriel orienté Access (de Caféine) mais très accessible
Ce lien n'existe plus pour aller au fond des choses (bien que..)
Tutoriel axé asp mais bien clair pour les Patterns
Des exemples de Patterns
Plus de 2700 Patterns pour les gourmands mais beaucoup tournés web ou américains

Liens forum :
Une transformation de date sous Word
Un ensemble de fonctions RegExp permettant de stocker une liste de noms à chercher, et de découper les chaînes sans les noms, et uniquement les noms de l'autre côté
Un "bête" exemple pour extraire un code postal d'une chaîne
Utilisation de masques dans un USF (fil un peu long pour tout suivre, mais en tant que "parrain", je ne peux pas ne pas le citer :p)
Séparation de NOMS (en majuscules) et Prénoms (en Minuscules)
Traitement de différents formats de dates
La séparation de mots en MAJUSCULES et en Minuscules avec des blancs
Euh, suppression des lettres dans un code, usage très limité...
Comment compter les mots dans une cellule

2 - PREMIERS PAS

2.1 - Fonction de base :

Fonction fournie dans le fichier joint :
Voici le code commenté de la fonction fournie dans le fichier joint :
VB:
FunctionCelle-ci permet donc de tester la validité du Pattern que l'on souhaite appliquer à une chaîne de caractères. Teste(ATester As String, MonPattern As String, MonType As String) As Boolean
' Arguments : ATester chaîne à vérifier, MonPattern motif à vérifier
' MonType pour savoir si 1 seule et unique occurrence trouvée (valeur "Unique",
' sinon, 1 à plusieurs occurences sont valides)
Dim Match, Matches
' Déclare une variable qui va renvoyer les résultats
' et une variable qui va contenir l'ensemble des résultats
Application.Volatile
' déclare l'application comme devant se mettre à jour à chaque calcul
With CreateObject("vbscript.regexp")
' déclare l'objet vbscript avec lequel on va "jouer"
.Global = True
' L'objet prendra toutes les occurrences possibles
.Pattern = MonPattern
' Utilise le Pattern apporté par la fonction pour la calculer
Set Matches = .Execute(ATester)
' Charge Matches avec les résultats de la String ATester
' en fonction du Pattern fourni à la fonction
If MonType = "Unique" Then
' Choix sur la fonction pour savoir si le résultat de Matches doit être unique
If Matches.Count = 1 Then Teste = True Else Teste = False
' Vérification sur le nombre de valeurs que comprend Matches
' si 1 alors renvoie vrai, sinon renvoie faux
Else
' Sinon, si on accepte plusieurs occurences
If Matches.Count >= 1 Then Teste = True Else Teste = False
' Renvoie Vrai si c'est le cas
End If
' Fin du test
End With
' Fin de l'objet
End Function
2 possibilités, retrouver un code unique (par exemple un Code Postal dans une cellule) ou plusieurs fois le motifs (un N° de sécurité sociale, en vérifiant juste que c'est des chiffres suivis d'un "-").

Un petit exemple :
On cherche à vérifier que l'adresse comprend un code postal, soit 5 chiffres consécutifs.
Si on regarde dans le tableau du fichier Excel joint, on peut voir qu'il y a 2 écritures pour des chiffres :
Soit une Classe (ensemble d'élément représentant un caractère) : [0-9]
Soit un équivalent de la classe fourni pour RegExp : \d
Le nombre d'occurrences est défini entre accolades, soit {5} en ce qui nous concerne.
Donc notre Pattern est \d{5}
Si on utilise notre fonction comme ceci :
Teste("88000", "\d{5}", "Unique") renvoie VRAI
Teste("88000 55000", "\d{5}", "Unique") renvoie FAUX
Teste("88000 55000", "\d{5}", "Plusieurs") renvoie VRAI
Par contre :
Teste("8800055000", "\d{5}", "Plusieurs") renvoie aussi VRAI :eek:
Ce qui prouve que notre Pattern n'est pas assez efficace, car il faudrait tenir compte que c'est un mot. Un peu de recherche dans le tableau Excel permet de voir que c'est \b qui permet de vérifier le début ou la fin d'un mot, donc le bon Pattern aurait été \b\d{5}\b :p...
Les puristes me diront qu'avec la notation américaine, "Beverly Hills, 90210" renverrait un code postal valide :rolleyes:... Pour être puriste, un vrai code postal, c'est F-88000, soit le Pattern \b\F\-d{5}\b pour la France :D...

(En construction, merci de patienter pour la suite ;)).
 

Pièces jointes

  • Patterns RegExp.xls
    55.5 KB · Affichages: 1 805
  • Patterns RegExp.xls
    55.5 KB · Affichages: 2 012
  • Patterns RegExp.xls
    55.5 KB · Affichages: 2 074
Dernière édition:

Discussions similaires

Réponses
22
Affichages
690

Statistiques des forums

Discussions
311 725
Messages
2 081 943
Membres
101 849
dernier inscrit
florentMIG