| Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente |
| powershell_regex [2020/01/17 12:45] – [Quelques exemples :] nekan | powershell_regex [2021/03/05 15:59] (Version actuelle) – nekan |
|---|
| ~~CLOSETOC~~ | |
| ====== Les expressions régulières (regex) ====== | ====== Les expressions régulières (regex) ====== |
| | <label type="info">Création</label> --- //[[nekan@shyrkasystem.com|Nicolas THOREZ]] 2020/01/17 15:31// |
| |
| 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. | 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. |
| * Pour s'entraîner et valider les regex : [[https://regex101.com/|regular expressions 101]] | * Pour s'entraîner et valider les regex : [[https://regex101.com/|regular expressions 101]] |
| |
| ==== Quelques exemples : ==== | ===== Quelques exemples : ===== |
| |
| <sxh powershell># Exemple 1 : on vérifie un code PIN de 4 chiffres. | <sxh powershell># Exemple 1 : on vérifie un code PIN de 4 chiffres. |
| # {8} signifie 8 itérations de [0-9] donc 8 chiffres compris entre 0 et 9 mais pas forcément les mêmes. | # {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.</sxh> | # $ signifie la fin de la chaîne.</sxh> |
| | |
| | Voici en suivant les différentes règles structurantes des regex. |
| | |
| | <callout type="info" icon="true" title="Interprétation">Tout caractère ou chaîne de caractères n'étant pas traité ici sera interprété tel quel par la regex.</callout> |
| |
| ===== Les caractères de structures ===== | ===== Les caractères de structures ===== |
| |< 100% 10% 45% 45% >| | |< 100% 10% 45% 45% >| |
| ^ Caractère ^ Explication ^ Exemple ^ | ^ 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. | <sxh powershell>"^PC-" | | ''^'' | 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. | <sxh powershell>"PC-COMPTA-1" -match "^PC-" |
| # Indique que la chaîne doit commencer par "PC-" | $true |
| "PC-" | "COMPTA-PC-01" -match "^PC-" |
| # Indique que la chaîne doit contenir "PC-"</sxh> | | $false |
| | "COMPTA-PC-01" -match "PC-" |
| | $true</sxh> | |
| | | ''^'' | Dans une liste, indique la négation. | <sxh powershell>"0" -match "[0-9]" |
| | $true |
| | "0" -match "[^0-9]" |
| | $false</sxh> | |
| | | ''$'' | En fin de chaîne, indique que la chaîne doit se terminer par les informations de la regex. | <sxh powershell>"Test1" -match "[0-9]$" |
| | $true |
| | "TestA" -match "[0-9]$" |
| | $false</sxh> | |
| | | ''[]'' | 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. | <sxh powershell>"a" -match "[abc]" |
| | $true |
| | "k" -match "[a-z]" |
| | $true |
| | "0" -match "[a-z]" |
| | $false |
| | "0" -match "[a-z0-9]" |
| | $true</sxh> | |
| | | ''()'' | 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) | <sxh powershell>"tata" -match "(t[ai]){2}" |
| | $true |
| | "titi" -match "(t[ai]){2}" |
| | $true |
| | "tati" -match "(t[ai]){2}" |
| | $true |
| | "toto" -match "(t[ai]){2}" |
| | $false</sxh> | |
| | | ''|'' | Dans un groupe, sépare un choix du choix précédent. | <sxh powershell>"tata" -match "(ta|ti|to){2}" |
| | $true |
| | "toti" -match "(ta|ti|to){2}" |
| | $true |
| | "tutu" -match "(ta|ti|to){2}" |
| | $false</sxh> | |
| | | ''\'' | 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 ''(''. | <sxh powershell>"1" -match "[0-9]" |
| | $true |
| | "1" -match "\[0-9\]" |
| | $false |
| | "[0-9]" -match "\[0-9\]" |
| | $true</sxh> | |
| | |
| | ===== Les opérateurs ===== |
| | |
| | |< 100% 10% 45% 45% >| |
| | ^ Caractère ^ Explication ^ Exemple ^ |
| | | ''*'' | Indique que la règle précédente peut être répété de 0 à x fois. | <sxh powershell>"a" -match "^[a]*$" |
| | $true |
| | '' -match "^[a]*$" |
| | $true |
| | "aaaaaaaaaaaaaaaaaaaaaaaa" -match "^[a]*$" |
| | $true |
| | "aaaaaabbbbaaaaaaaaaaaaaa" -match "^[a]*$" |
| | $false</sxh> | |
| | | ''+'' | Indique que la règle précédente peut être répété de 1 à x fois. | <sxh powershell>"a" -match "^[a]+$" |
| | $true |
| | '' -match "^[a]+$" |
| | $false |
| | "aaaaaaaaaaaaaaaaaaaaaaaa" -match "^[a]+$" |
| | $true |
| | "aaaaaabbbbaaaaaaaaaaaaaa" -match "^[a]+$" |
| | $false</sxh> | |
| | | ''?'' | Indique que la règle précédente peut être répété de 0 à 1 fois. | <sxh powershell>"a" -match "^[a]?$" |
| | $true |
| | '' -match "^[a]?$" |
| | $true |
| | "aaaaaaaaaaaaaaaaaaaaaaaa" -match "^[a]?$" |
| | $false</sxh> | |
| | | ''{}'' | 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. | <sxh powershell>"aaa" -match "^[a]{3}$" |
| | $true |
| | "aaa" -match "^[a]{2,3}$" |
| | $true |
| | "aaaa" -match "^[a]{2,3}$" |
| | $false |
| | "aaaa" -match "^[a]{2,}$" |
| | $true</sxh> | |
| | |
| | ===== Les ensembles de caractères ===== |
| | |
| | |< 100% 10% 45% 45% >| |
| | ^ 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''. | <sxh powershell>"0" -match "." |
| | $true |
| | "a" -match "." |
| | $true</sxh> | |
| | | ''\d'' | Correspond à n'importe quel caractère décimal. Équivalent de ''[0-9]''. | <sxh powershell>"0" -match "\d" |
| | $true |
| | "a" -match "\d" |
| | $false</sxh> | |
| | | ''\D'' | Correspond à n'importe quel caractère n'étant pas décimal. Équivalent de ''[^0-9]''. | <sxh powershell>"0" -match "\D" |
| | $false |
| | "a" -match "\d" |
| | $true</sxh> | |
| | | ''\w'' | Correspond à n'importe quel caractère alphabétique. Équivalent de ''[a-z0-9_]''. | <sxh powershell>"+" -match "\w" |
| | $false |
| | "0" -match "\w" |
| | $true |
| | "a" -match "\w" |
| | $true</sxh> | |
| | | ''\W'' | Correspond à n'importe quel caractère n'étant pas alphabétique. Équivalent de ''[^a-z0-9_]''. | <sxh powershell>"+" -match "\W" |
| | $true |
| | "0" -match "\W" |
| | $false |
| | "a" -match "\W" |
| | $false</sxh> | |
| | | ''\s'' | Correspond à un espace. | <sxh powershell>"0" -match "\s" |
| | $false |
| | " " -match "\s" |
| | $true</sxh> | |
| | | ''\S'' | Correspond à n'importe quel caractère autre que l'espace. | <sxh powershell>"0" -match "\S" |
| | $true |
| | " " -match "\S" |
| | $false</sxh> | |
| | |
| | ===== Quelques regex intéressantes ===== |
| | |
| | * Vérifier une adresse IPv4 : |
| | <sxh powershell>"^((25[0-5]|2[0-4]\d]|[1]?\d?\d)\.){3}(25[0-5]|2[0-4]\d|[1]?\d?\d)$"</sxh> |
| | |
| | * Vérifier une adresse IPv4, hors adresse de réseau et de broadcast (sans les .0 et .255) : |
| | <sxh powershell>"^(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?)$"</sxh> |
| |
| | * Vérifier une adresse mail : |
| | <sxh powershell>"^\w*[.-]?\w*@\w(\w|-)*(\.([a-z]){2,3}){1,2}$"</sxh> |
| |
| ~~DISCUSSION~~ | ~~DISCUSSION~~ |
| |