Débuter avec RegEx
Introduction
Dans ce chapitre, nous allons découvrir les expressions régulières souvent abrégées en RegEx. Le fonctionnement de RegEx étant complexe, nous allons donc étudier ces expressions de manière progressive, pour vous permettre d’assimiler leurs différents cas d’usages.
Le but de ce chapitre sera donc de décrire ce qu’est RegEx et d’essayer de comprendre en quelques exemples simples l’intérêt et comment l’utiliser dans les grandes lignes. Nous n’irons pas dans les détails car RegEx est un sujet tellement vaste qu’il pourrait faire l’objet d’un livre.
Démystifier RegEx, ou tout du moins essayer
1. Qu’est-ce que RegEx ?
RegEx (Regular Expression), également nommé « expressions régulières », est une méthode permettant d’effectuer des recherches de mots, caractères ou autres dans un fichier, un texte…
Cela permet également, en fonction d’un modèle défini (qui sera notre suite RegEx), de valider une saisie utilisateur.
RegEx se retrouve dans la plupart des langages informatiques et apparaît au premier abord comme assez difficile à appréhender et à manier.
Il s’agit d’un outil très puissant qui permet de filtrer n’importe quels texte, chaîne ou contenu de fichier pour trouver quelque chose.
RegEx se retrouve dans de nombreux outils de notre quotidien pour valider, vérifier quelque chose qui a été saisi par un utilisateur :
-
Validation d’adresse e-mail lors d’une saisie d’identifiants.
-
Validation de mot de passe lors d’une saisie d’identifiants.
-
Validation de numéro de sécurité sociale.
-
Validation de numéro fiscal.
2. RegEx et syntaxe
La syntaxe des expressions régulières est ce qui a tendance à nous éloigner de leur utilisation. En effet, il s’agit généralement d’une suite de caractères et symboles qui n’ont à première vue aucun sens et très difficile à décrypter.
Prenons l’exemple suivant : [0-9A-Z]{5}. Il s’agit en fait d’une suite RegEx permettant de définir que les cinq premiers caractères doivent être de type alphanumérique (lettres ou chiffres).
Ou encore celui-ci : ^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$. Il s’agit d’une expression régulière (RegEx) permettant de valider une adresse e-mail.
En RegEx, il y aura deux caractères que nous retrouverons régulièrement en début et fin du code :
-
^ : signifie le début d’une chaîne de caractères.
-
$ : signifie la fin d’une chaîne de caractères.
Nous allons donc lister les caractères les plus utiles et simples en RegEx.
a. Les caractères d’échappement
Par défaut en PowerShell, le caractère...
Exemples rapides
La chaîne doit contenir au moins le mot
Nous souhaitons ici vérifier qu’une chaîne de caractères contient au moins le mot « bonjour ». Pour vérifier l’utilisation d’un mot précis, nous utiliserons \b.
Ci-dessous l’expression régulière :
\bbonjour*$
La chaîne doit contenir une valeur entre deux bornes
Nous utiliserons une rangée de lettres entre a et z puis spécifierons notre valeur de début 3 et valeur de fin 7 entre les caractères { et }.
Ci-dessous l’expression régulière :
^[a-z]{3,7}$
La chaîne ne doit pas contenir le mot
Nous souhaitons ici vérifier qu’une chaîne de caractères ne contient pas le mot « toto ». Pour exclure un mot, nous utiliserons ?!.
Ci-dessous l’expression régulière :
^((?!toto).)*$
La chaîne doit commencer par un chiffre
Pour vérifier qu’une chaîne commence par un chiffre, nous pouvons utiliser \d ou la rangée [0-9].
Ci-dessous les deux possibilités :
^\d
OU
^[0-9]
La chaîne doit contenir au moins un chiffre
Contrairement à l’exemple précédent, nous n’utiliserons pas le caractère ^.
Ci-dessous l’expression régulière :
\d
La chaîne doit commencer...
Les ressources intéressantes
Il existe de nombreux sites permettant de générer ou vérifier des expressions régulières. Ci-dessous une liste de certains de ces sites :
Quelques exemples du quotidien
Nous allons voir ci-dessous quelques suites rapides de RegEx avec ce qu’elles font.
1. Validation d’une adresse e-mail
Ci-dessous l’expression régulière permettant de valider une adresse e-mail :
^[\w-\.]+@\w+\.+[\w-]{2,4}$
Pour être valide, une adresse e-mail doit contenir :
-
une suite de caractères,
-
le caractère « @ »,
-
une autre suite de caractères,
-
le caractère « . »,
-
une suite de caractères entre deux et quatre chiffres.
Analysons donc cette expression point par point :
-
^ : spécifie le début d’une chaîne de caractères.
-
[ ] : spécifie un ensemble de caractères.
-
\w : n’importe quel caractère alphanumérique ou underscore.
-
- : spécifie le séparateur de l’ensemble.
-
\. : il peut y avoir tous les caractères sauf le retour chariot.
-
[\w-\.] : l’ensemble doit donc contenir n’importe quels caractères alphanumériques (autant que l’on souhaite).
-
+@\w : le contenu précédent doit être présent au moins une fois puis être succédé par le caractère @ puis par n’importe quel caractère alphanumérique ou underscore.
-
+\. : le contenu précédent doit être présent au moins une fois puis il doit y avoir un point « . ».
-
[\w-\.] : le contenu précédent doit ensuite contenir n’importe quels caractères alphanumériques (autant que l’on souhaite).
-
{2,4} : l’ensemble précédent doit contenir entre deux et quatre caractères.
-
$ : spécifie la fin d’une chaîne de caractères.
2. Saisie de nom d’ordinateur
Nous allons créer un système de vérification de nom d’ordinateur.
Ci-dessous, ce que nous souhaitons :
-
Le nom doit commencer par desktop ou laptop puis -.
-
Ensuite, il doit y avoir une suite de caractères alphabétiques qui doit contenir entre trois et sept caractères.
L’expression régulière sera la suivante :
\bdesktop\-[a-z]{3,7}$|\blaptop\-[a-z]{3,7}$
Détaillons ce que nous souhaitons avec l’équivalent...
PowerShell et RegEx
1. Utiliser RegEx avec PowerShell
Nous avons étudié comment fonctionnait RegEx ainsi que quelques exemples simples d’utilisation.
Nous allons maintenant étudier comment utiliser RegEx avec PowerShell afin de vérifier une suite de caractères ou le contenu d’un fichier.
Il existe différentes méthodes permettant d’utiliser RegEx avec PowerShell. Nous verrons ces méthodes d’abord en théorie puis en pratique en utilisant nos exemples précédents.
a. -Match et -NotMatch
Il ne s’agit pas ici d’une méthode mais de deux opérateurs, au même titre que -eq (equal), -gt (greater than), -lt (lesser than)…
Davantage d’informations sur les opérateurs dans le chapitre Les opérateurs.
L’opérateur -Match permettra de vérifier qu’une chaîne de caractères correspond à un modèle RegEx.
L’opérateur -NotMatch, quant à lui, permettra de vérifier qu’une chaîne de caractères ne correspond pas à un modèle RegEx.
L’utilisation de ces deux opérateurs avec un modèle RegEx s’effectue ainsi :
<Chaîne de caractères> -Match <Modèle RegEx>
<Chaîne de caractères> -NotMatch <Modèle RegEx>
Cela retournera ensuite un résultat True ou False.
L’exemple suivant vérifie si une chaîne est comprise entre 0 et 6 :
PS C:\Users\damien.vanrobaeys> "5" -match "^[0-6]$"
True
L’exemple suivant vérifie si une chaîne n’est pas comprise entre 0 et 6 :
PS C:\Users\damien.vanrobaeys> "5" -notmatch "^[0-6]$"
False
L’utilisation des opérateurs -Match et -NotMatch fonctionne à merveille, mais cela retournera par défaut un booléen True ou False.
Pour récupérer du contenu sur des chaînes de caractères en utilisant une expression régulière, il faudra utiliser la méthode $matches.
b. Classe [regex]
PowerShell propose, outre l’opérateur -Match, une classe permettant de valider un modèle RegEx. Cette classe est [regex].
Nous allons tout d’abord initialiser notre objet en lui assignant notre modèle RegEx....