powershell_regex

Ceci est une ancienne révision du document !


~~CLOSETOC~~

Les expressions régulières (regex)

Les expressions régulières ou regex peuvent paraître compliquées au premier abord mais en y regardant de plus près, on se rend compte que c'est plutôt simple. Le principe d'une expression régulière est de créer un schéma qui permettra de valider la forme d'une chaîne de caractères. Par exemple, si dans un script, vous demandez à l'utilisateur de renseigner son numéro de téléphone au format international, il vous faudra valider la réponse de ce dernier. Si il répond +33123456789 pour la france ou +8612345678901 pour un portable chinoix, c'est bon, mais si il répond toto@messagerie.com ou James BOND, ça ne l'est pas. La réponse va alors pouvoir être comparée à une regex et si le résultat renvoyé est $true, alors la réponse de l'utilisateur correspond au format de réponse attendue.

# Exemple 1 : on vérifie un code PIN de 4 chiffres.
"0123" -match "^[0-9]{4}$"
$true
"012a" -match "^[0-9]{4}$"
$false

# Dans cet exemple :
#     ^ signifie le début de la chaîne.
#     [0-9] signifie un chiffre de 0 à 9.
#     {4} signifie 4 itérations de [0-9] donc 4 chiffres compris entre 0 et 9 mais pas forcément les mêmes.
#     $ signifie la fin de la chaîne.

# Exemple 2 : on vérifie un numéro de téléphone en France, hors portables et numéros spéciaux ou à tarifications particulières.
"0123456789" -match "^0[1-5][0-9]{8}$"
$true
"0800123456" -match "^0[1-5][0-9]{8}$"
$false
"+33123456789" -match "^0[1-5][0-9]{8}$"
$false

# Dans cet exemple :
#     ^ signifie le début de la chaîne.
#     0 signifie litéralement le chiffre 0.
#     [1-5] signifie un chiffre de 1 à 5.
#     [0-9] signifie un chiffre de 0 à 9.
#     {8} signifie 8 itérations de [0-9] donc 8 chiffres compris entre 0 et 9 mais pas forcément les mêmes.
#     $ signifie la fin de la chaîne.

Voici en suivant les différentes règles structurantes des regex.

<note>Tout caractère ou chaîne de caractères n'étant pas traité ici sera interprété tel quel par la regex.</note>

Caractère Explication Exemple
^ En début de chaîne, indique que la chaîne doit commencer par les informations de la regex. Sans cela, la comparaison ce fera à partir de n'importe quel caractère de la chaîne à vérifier.
"PC-COMPTA-1" -match "^PC-"
$true
"COMPTA-PC-01" -match "^PC-"
$false
"COMPTA-PC-01" -match "PC-"
$true
^ Dans une liste, indique la négation.
"0" -match "[0-9]"
$true
"0" -match "[^0-9]"
$false
$ En fin de chaîne, indique que la chaîne doit se terminer par les informations de la regex.
"Test1" -match "[0-9]$"
$true
"TestA" -match "[0-9]$"
$false
[] Indique une liste de caractères possibles. Cela peut être un caractère seul ([a] pour la lettre a uniquement), une série de caractères ([abc] pour les lettres a, b ou c) ou une suite de caractère, symbolisée par le premier et le dernier caractère de la série, séparés par un - ([a-z] pour n'importe quelle lettre de a à z). Toutes ces possibilités sont cumulables dans la même liste.
"a" -match "[abc]"
$true
"k" -match "[a-z]"
$true
"0" -match "[a-z]"
$false
"0" -match "[a-z0-9]"
$true
() Indique un groupe, généralement composé de plusieurs règles. L'utilité est d'appliquer un même opérateur à tous les éléments du groupe (voir la section des opérateurs plus bas) ou d'appliquer un choix parmi plusieurs propositions, ces dernières étant les différents sections du groupe (voir le séparateur | si dessous)
"tata" -match "(t[ai]){2}"
$true
"titi" -match "(t[ai]){2}"
$true
"tati" -match "(t[ai]){2}"
$true
"toto" -match "(t[ai]){2}"
$false
| Dans un groupe, sépare un choix du choix précédent.
"tata" -match "(ta|ti|to){2}"
$true
"toti" -match "(ta|ti|to){2}"
$true
"tutu" -match "(ta|ti|to){2}"
$false
\ Lorsqu'il précède un des ces caractères reservés []().\^$|?*+{}, la regex n'interprètera pas le caractère comme une règle mais seulement comme un simple caractère. Ainsi \( ne signifie pas le début d'un groupe mais simplement le caractère (.
"1" -match "[0-9]"
$true
"1" -match "\[0-9\]"
$false
"[0-9]" -match "\[0-9\]"
$true
Caractère Explication Exemple
* Indique que la règle précédente peut être répété de 0 à x fois.
"a" -match "^[a]*$"
$true
'' -match "^[a]*$"
$true
"aaaaaaaaaaaaaaaaaaaaaaaa" -match "^[a]*$"
$true
"aaaaaabbbbaaaaaaaaaaaaaa" -match "^[a]*$"
$false
+ Indique que la règle précédente peut être répété de 1 à x fois.
"a" -match "^[a]+$"
$true
'' -match "^[a]+$"
$false
"aaaaaaaaaaaaaaaaaaaaaaaa" -match "^[a]+$"
$true
"aaaaaabbbbaaaaaaaaaaaaaa" -match "^[a]+$"
$false
? Indique que la règle précédente peut être répété de 0 à 1 fois.
"a" -match "^[a]?$"
$true
'' -match "^[a]?$"
$true
"aaaaaaaaaaaaaaaaaaaaaaaa" -match "^[a]?$"
$false
{} Si les {} contiennent un nombre, il s'agit du nombre d'itération obligatoire de la règle précédente. Les {} peuvent aussi comportées 2 nombres (x et y), séparés par une virgule, le premier étant plus petit que le second, ce qui signifie que la règle précédente doit être répétée entre x et y fois. y peut être ignoré, ce qui indique une limite haute infinie.
"aaa" -match "^[a]{3}$"
$true
"aaa" -match "^[a]{2,3}$"
$true
"aaaa" -match "^[a]{2,3}$"
$false
"aaaa" -match "^[a]{2,}$"
$true
Caractère Explication Exemple
\n Indique une nouvelle à la ligne.
\r Indique un retour chariot.
\t Indique une tabulation.
. Correspond à n'importe quel caractère, exception faîte d'un retour à la ligne \n.
"0" -match "."
$true
"a" -match "."
$true
\d Correspond à n'importe quel caractère décimal. Équivalent de [0-9].
"0" -match "\d"
$true
"a" -match "\d"
$false
\D Correspond à n'importe quel caractère n'étant pas décimal. Équivalent de [^0-9].
"0" -match "\D"
$false
"a" -match "\d"
$true
\w Correspond à n'importe quel caractère alphabétique. Équivalent de [a-z0-9_].
"+" -match "\w"
$false
"0" -match "\w"
$true
"a" -match "\w"
$true
\W Correspond à n'importe quel caractère n'étant pas alphabétique. Équivalent de [^a-z0-9_].
"+" -match "\W"
$true
"0" -match "\W"
$false
"a" -match "\W"
$false
\s Correspond à un espace.
"0" -match "\s"
$false
" " -match "\s"
$true
\S Correspond à n'importe quel caractère autre que l'espace.
"0" -match "\S"
$true
" " -match "\S"
$false
  • Vérifier une adresse IPv4 :

"^((25[0-5]|2[0-4]\d]|[1]?\d?\d)\.){3}(25[0-5]|2[0-4]\d|[1]?\d?\d)$"

  • Vérifier une adresse IPv4, hors adresse de réseau et de broadcast (sans les .0 et .255) :

"^(25[0-5]|2[0-4]\d]|[1]\d?\d?|[1-9]\d?)\.((25[0-5]|2[0-4]\d|[1]?\d?\d)\.){2}(25[0-4]|2[0-4]\d|[1]\d?\d?|[1-9]\d?)$"

  • Vérifier une adresse mail :

"^\w*[.-]?\w*@\w(\w|-)*(\.([a-z]){2,3}){1,2}$"

Nicolas THOREZ 2020/01/17 15:31

Entrer votre commentaire. La syntaxe wiki est autorisée:
 
  • powershell_regex.1599051641.txt.gz
  • Dernière modification : 2020/09/02 15:00
  • de nekan