VBA – Expressions Rationnelles (Regex)
In this Article
Ce tutoriel montre comment utiliser Regex en VBA.
Qu’est-ce que Regex ?
Regex est l’abréviation de « regular expression » en anglais se traduit « expression rationnelles ». Une expression rationnelle est un modèle composé d’une séquence de caractères que vous pouvez utiliser pour trouver un modèle correspondant dans une autre chaîne. Pour utiliser la Regex dans VBA, vous devez utiliser l’objet RegExp.
Un motif tel que [A-C] peut être utilisé pour rechercher et faire correspondre une lettre majuscule de A à C dans une séquence. Les motifs Regex ont leur propre syntaxe et peuvent être construits à partir d’un caractère ou d’une séquence de caractères.
Caractères Correspondants
Le tableau suivant présente la syntaxe qui vous permettra de construire des motifs Regex.
Syntaxe du motif | Description | Exemple | Correspondances trouvées |
---|---|---|---|
. | Correspond à tout caractère unique, sauf vbNewLine | f.n | fan, fon, f@n, fwn |
[caractères] | Correspond à n’importe quel caractère entre crochets [] | [fn] | Ne correspondrait qu’à « f » ou « n » dans fan |
[^caractères] | Correspond à tout caractère unique qui n’est pas entre crochets[] | [^fn] | Correspondrait donc à « j » dans « fjn » |
[début-fin] | Correspond à tout caractère faisant partie de l’intervalle entre crochets[] | [1-5] | Correspondrait à « 4 » et « 5 » dans « 45 » |
\w | Correspond aux caractères alphanumériques et au trait de soulignement, mais pas au caractère espace | \w | Correspond à « c » dans « ,c. » |
\W | Correspond à tous les caractères non alphanumériques et au trait de soulignement | \W | Correspondrait à « @ » dans « bb@bb » |
\s | Correspond à tout caractère d’espace vide tel que les espaces et les tabulations | \s | Correspondrait à » » dans « C’est » |
\S | Correspond à tout caractère autre qu’un espace blanc | \S | Correspond à « T » et « h » dans « T h » |
\d | Correspond à tout chiffre décimal unique | \d | Correspond au « 7 » dans « a7h » |
\D | Correspond à n’importe quel chiffre non décimal | \D | Correspond au « j » dans « 47j » |
\ | Échappe les caractères spéciaux, ce qui vous permet de les rechercher | \. | Correspondrait à « . » dans « 59.pQ » |
\t | Tabulation | \t | Correspond à un caractère de tabulation |
\r | Retour chariot | \r | Correspond à un retour chariot (vbCr) |
\n | vbNewLine(vbTab) | \n | Correspond à une nouvelle ligne |
Quantificateurs
Vous pouvez utiliser des quantificateurs pour indiquer combien de fois vous voulez que le motif corresponde à la chaîne.
Quantificateur | Description | Exemple | Correspondances trouvées |
---|---|---|---|
* | Correspond à zéro ou plusieurs occurrences | fn*a | fna, fa, fnna, fnnna, fnfnnna |
+ | Correspond à une ou plusieurs occurrences | fn+a | fna, fnna, fnfnna |
? | Correspond à zéro ou un | fn?a | fa, fna |
{n} | Correspond à « n » plusieurs fois | d\W{4} | Correspondrait à « d…. » dans « d….&5hi » |
{n,} | Correspond à au moins « n » fois | d\W{4,} | Correspondrait à « d….& » dans « d….&5hi » |
{n,m} | Correspond à un nombre de fois compris entre n et m | d\W{1,8} | Correspondrait à « d….&&&& » dans « d….&&&&5hi » |
Regroupement
Le regroupement ou la capture vous permet d’utiliser un motif pour capturer et extraire une partie d’une chaîne. Ainsi, non seulement le motif est comparé, mais la partie de la chaîne qui correspond au motif est capturée.
Modèle | Description | Exemple | Correspondances trouvées et capturées |
---|---|---|---|
(expression) | Regroupe et capture le motif entre parenthèses | (\W{4}) | Regroupe et capture « @@@@ » dans « 1@@@@1jlmba » |
Comment Utiliser Regex en VBA
Pour utiliser Regex dans VBA, vous devez d’abord définir la référence dans l’éditeur VBE. Dans l’éditeur VBE, allez dans Outils > Références > Microsoft VBScript Regular Expressions
Voici les propriétés de l’objet RegExp :
- Pattern – Le motif que vous allez utiliser pour la correspondance avec la chaîne.
- IgnoreCase – Si Vrai, alors la correspondance ignore la casse des lettres.
- Global – Si Vrai, alors toutes les correspondances du motif dans la chaîne sont trouvées. Si Faux, seule la première correspondance est trouvée.
- MultiLine – Si True, la correspondance du motif se fait à travers les sauts de ligne.
Voici les méthodes de l’objet RegExp :
- Test – Recherche un motif dans une chaîne et renvoie True si une correspondance est trouvée.
- Replace – Remplace les occurrences du motif par la chaîne de remplacement.
- Execute – Renvoie les correspondances du motif avec la chaîne de caractères.
Test de la Correspondance d’un Motif avec une Chaîne de Caractères
Vous pouvez utiliser la méthode Test pour vérifier si un motif correspond à une séquence dans la chaîne d’entrée. Le résultat est Vrai si une correspondance est trouvée. Le code suivant vous montre comment tester un motif par rapport à une chaîne de caractères :
Sub RegexTesterUnMotif()
Dim chaineUn As String
Dim regexUn As Object
Set regexUn = New RegExp
regexUn.Pattern = "f....a"
chaineUn = "000111fjo88a8"
Debug.Print regexUn.Test(chaineUn)
End Sub
Le résultat est le suivant :
Remplacement d’un Motif dans une Chaîne de Caractères
Vous pouvez utiliser la méthode Replace pour remplacer la première instance d’un motif correspondant dans une chaîne ou toutes les instances d’un motif correspondant dans une chaîne. Si Global a la valeur Faux, seule la première instance est remplacée. Le code suivant vous montre comment remplacer un motif dans une chaîne de caractères :
Sub RegexRemplaceUnMotif()
Dim chaineUn As String
Dim regexUn As Object
Set regexUn = New RegExp
regexUn.Pattern = "Voici le numéro"
regexUn.Global = False
chaineUn = "Voici le numéro 718901"
Debug.Print regexUn.Replace(chaineUn, "Voici le nouveau numéro")
End Sub
Le résultat est le suivant :
Pour remplacer uniquement la partie numérotée de la chaîne utilisée ci-dessus, vous utiliseriez le code suivant :
Sub RegexRemplaceUnMotifNuméros()
Dim chaineUn As String
Dim regexUn As Object
Set regexUn = New RegExp
regexUn.Pattern = "[^\D]+"
regexUn.Global = False
chaineUn = "Voici le numéro 718901"
Debug.Print regexUn.Replace(chaineUn, "777192")
End Sub
Le résultat est le suivant :
Pour remplacer chaque instance d’un certain motif dans une chaîne de caractères, vous devez définir la valeur globale à True. Le code suivant vous montre comment remplacer chaque instance de -A1289C- dans la chaîne :
Sub RegexRemplaceChaqueInstanceMotif()
Dim chaineUn As String
Dim regexUn As Object
Set regexUn = New RegExp
regexUn.Pattern = "\W\A\d+C\W"
regexUn.Global = True
chaineUn = "ABC-A1289C-ABC-A1289C-ABC"
Debug.Print regexUn.Replace(chaineUn, "IJK")
End Sub
Mise en Correspondance et Affichage d’un Motif dans une Chaîne de Caractères
Vous pouvez utiliser la méthode Execute pour faire correspondre une ou toutes les instances d’un motif dans une chaîne. Le code suivant vous montre comment faire correspondre et afficher toutes les instances du motif de la chaîne :
Sub RegexCorrespondanceEtAffichageMotif()
Dim chaineUn As String
Dim regexUn As RegExp
Set regexUn = New RegExp
regexUn.Pattern = "A.C"
regexUn.Global = True
regexUn.IgnoreCase = True
chaineUn = "ABC-A1289C-ADC-A1289C-AJC"
Set lesCorrespondances = regexUn.Execute(chaineUn)
For Each correspondance In lesCorrespondances
Debug.Print correspondance.Value
Next correspondance
End Sub
Le résultat est le suivant :
Supposons que nous voulions uniquement faire correspondre -ADC- à la chaîne ci-dessus. Le code suivant montre comment faire correspondre et afficher uniquement -ADC- dans la chaîne :
Sub RegexCorrespondanceEtAffichageMotifSpécifique()
Dim chaineUn As String
Dim regexUn As RegExp
Set regexUn = New RegExp
regexUn.Pattern = "\-\A.C\-"
regexUn.Global = False
regexUn.IgnoreCase = True
chaineUn = "ABC-A1289C-ADC-A1289C-AJC"
Set lesCorrespondances = regexUn.Execute(chaineUn)
For Each correspondance In lesCorrespondances
Debug.Print correspondance.Value
Next correspondance
End Sub
L’apprentissage de Regex peut prendre un certain temps, mais c’est un outil extrêmement puissant pour identifier et manipuler des chaînes de texte. Elle est également largement utilisée dans les langages de programmation.