Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Brève description
Décrit les expressions régulières dans PowerShell.
Description longue
Remarque
Cet article présente la syntaxe et les méthodes d’utilisation d’expressions régulières dans PowerShell. Il ne couvre pas toutes les expressions possibles. Pour une référence plus complète, consultez le document Regular Expression Language - Quick Reference.
Une expression régulière est un modèle utilisé pour faire correspondre le texte. Il peut être constitué de caractères littéraux, d’opérateurs et d’autres constructions. PowerShell utilise le moteur regex .NET .
Cet article illustre la syntaxe d’expression régulière dans PowerShell. PowerShell a plusieurs opérateurs et applets de commande qui utilisent des expressions régulières. Vous pouvez en savoir plus sur leur syntaxe et leur utilisation dans les liens ci-dessous.
- Select-String
- -match et opérateurs de -replace
- -split, opérateur
- switch, instruction avec option -regex
Les expressions régulières PowerShell sont insensibles à la casse par défaut. Chaque méthode présentée ci-dessus permet de forcer la sensibilité à la casse d'une manière différente.
- Pour
Select-String, utilisez le paramètre CaseSensitive. - Pour les opérateurs qui utilisent des expressions régulières, utilisez la version distinguant majuscules et minuscules :
-cmatch,-creplaceou-csplit - Pour l’instruction
switch, utilisez l’option-CaseSensitive
Littéraux de caractère
Une expression régulière peut être un caractère littéral ou une chaîne. L'expression fait en sorte que le moteur corresponde exactement au texte spécifié.
# This statement returns true because book contains the string "oo"
'book' -match 'oo'
Classes de caractères
Alors que les caractères littéraux fonctionnent si vous connaissez le motif exact, les classes de caractères vous permettent d'être moins précis.
Groupes de caractères
[character group] vous permet de faire correspondre n’importe quel nombre de caractères une fois, tandis que [^character group] correspond uniquement aux caractères NON dans le groupe.
# This expression returns true if the pattern matches big, bog, or bug.
'big' -match 'b[iou]g'
Si votre liste de caractères à mettre en correspondance inclut le caractère de trait d’union (-), il doit être au début ou à la fin de la liste pour le distinguer d’une expression de plage de caractères.
Plages de caractères
Un motif peut également être une plage de caractères. Les caractères peuvent être des [A-Z]alphabétiques, des [0-9]numériques ou même des [ -~] basés sur ASCII (tous les caractères imprimables).
# This expression returns true if the pattern matches any 2 digit number.
42 -match '[0-9][0-9]'
Nombres
La \d classe de caractères correspond à n’importe quel chiffre décimal. À l’inverse, \D correspond à n’importe quel caractère, à l’exception des chiffres décimaux.
# This expression returns true if it matches a server name.
# (Server-01 - Server-99).
'Server-01' -match 'Server-\d\d'
Caractères verbaux
La classe de caractères \w correspond à n’importe quel caractère de mot [a-zA-Z_0-9]. Pour faire correspondre n'importe quel caractère autre qu'un mot, utilisez \W.
# This expression returns true.
# The pattern matches the first word character 'B'.
'Book' -match '\w'
Caractères génériques
Le point (.) est un caractère générique dans les expressions régulières. Il correspond à n’importe quel caractère à l’exception d’une nouvelle ligne (\n).
# This expression returns true.
# The pattern matches any 4 characters except the newline.
'a1\ ' -match '....'
Espace blanc
Vous pouvez faire correspondre n’importe quel espace blanc à la classe de caractères \s. Vous pouvez faire correspondre tout caractère autre qu'un espace avec \S. Vous pouvez faire correspondre les caractères d'espacement littéraux avec .
# This expression returns true.
# The pattern uses the whitespace character class to match the leading
# space and a literal space to matching the trailing space.
' - ' -match '\s- '
Quantificateurs
Les quantificateurs contrôlent le nombre d’instances de chaque élément qui doivent être présentes dans la chaîne d’entrée.
Voici quelques-uns des quantificateurs disponibles dans PowerShell :
| Quantificateur | Description |
|---|---|
* |
Zéro ou plusieurs fois. |
+ |
Une ou plusieurs fois. |
? |
Zéro ou une fois. |
{n,m} |
Au moins n, mais pas plus de m fois. |
L’astérisque (*) correspond à l’élément précédent zéro ou plusieurs fois. Il en résulte que même une chaîne d'entrée sans l'élément serait une correspondance.
# This returns true for all account name strings even if the name is absent.
'ACCOUNT NAME: Administrator' -match 'ACCOUNT NAME:\s*\w*'
Le signe plus (+) correspond à l’élément précédent une ou plusieurs fois.
# This returns true if it matches any server name.
'DC-01' -match '[A-Z]+-\d\d'
Le point d'interrogation ? correspond à l'élément précédent zéro ou une fois. Comme un astérisque *, il correspond même aux chaînes où l’élément est absent.
# This returns true for any server name, even server names without dashes.
'SERVER01' -match '[A-Z]+-?\d\d'
Le quantificateur {n, m} peut être utilisé de plusieurs façons différentes pour permettre un contrôle granulaire sur le quantificateur. Le deuxième élément m et la virgule , sont facultatifs.
| Quantificateur | Description |
|---|---|
{n} |
Correspond à EXACTEMENT n fois. |
{n,} |
Correspond au MOINS n fois. |
{n,m} |
correspond à un nombre de fois compris entre n et m. |
# This returns true if it matches any phone number.
'111-222-3333' -match '\d{3}-\d{3}-\d{4}'
Ancres
Les ancres vous permettent de faire en sorte qu'une recherche aboutisse ou échoue en fonction de la position de la recherche dans la chaîne d'entrée.
Les deux ancres couramment utilisées sont ^ et $. Le caret ^ correspond au début d'une chaîne, et $, à la fin d'une chaîne. Les ancres vous permettent de faire correspondre votre texte à une position spécifique tout en ignorant les caractères indésirables.
# The pattern expects the string 'fish' to be the only thing on the line.
# This returns FALSE.
'fishing' -match '^fish$'
Remarque
Lors de la définition d’un regex contenant une ancre ($), vous devez placer le regex entre guillemets simples ('). Si vous utilisez des guillemets doubles ("), PowerShell interprète la chaîne comme une expression variable extensible.
Lorsque vous utilisez des ancres dans PowerShell, vous devez comprendre la différence entre les options d'expressions régulières monoligne et multiligne .
-
multiligne : le mode multiligne force
^et$à correspondre au début et à la fin de chaque ligne au lieu du début et de la fin de la chaîne d’entrée. -
Ligne unique : Le mode Singleline traite la chaîne d'entrée comme une SingleLine.
Il force le caractère
.à correspondre à tous les caractères (y compris les nouvelles lignes), au lieu de correspondre à tous les caractères SAUF la nouvelle ligne\n.
Pour en savoir plus sur ces options et leur utilisation, consultez le langage des expressions rationnelles - guide de référence rapide.
Caractères d’échappement
La barre oblique inverse (\) est utilisée pour échapper aux caractères afin qu'ils ne soient pas analysés par le moteur d'expressions régulières.
Les caractères suivants sont réservés : [().\^$|?*+{.
Vous devrez échapper ces caractères dans vos modèles pour les faire correspondre à vos chaînes d'entrée.
# This returns true and matches numbers with at least 2 digits of precision.
# The decimal point is escaped using the backslash.
'3.141' -match '3\.\d{2,}'
Il existe une méthode statique de la classe regex qui peut échapper du texte pour vous.
[regex]::Escape('3.\d{2,}')
3\.\\d\{2,}
Remarque
Elle échappe tous les caractères d'expression régulière réservés, y compris les barres obliques inverses existantes utilisées dans les classes de caractères. Veillez à ne l'utiliser que pour la partie de votre motif que vous devez échapper.
Autres échappements de caractères
Il existe également des échappements de caractères réservés que vous pouvez utiliser pour faire correspondre des types de caractères spéciaux.
Vous trouverez ci-dessous quelques échappements de caractères couramment utilisés :
| Échappement de caractères | Description |
|---|---|
\t |
Correspond à une tabulation |
\n |
Correspond à une nouvelle ligne |
\r |
Correspond à un retour chariot |
Groupes, captures et substitutions
Le regroupement sépare une chaîne d’entrée en sous-chaînes qui peut être capturée ou ignorée. Les sous-chaînes groupées sont appelées sous-expressions. Par défaut, les sous-expressions sont capturées dans des groupes numérotés, mais vous pouvez également leur attribuer des noms.
Une construction de regroupement est une expression régulière entourée de parenthèses. Tout texte mis en correspondance par l’expression régulière indiquée est capturé. L’exemple suivant montre comment décomposer le texte d’entrée en deux groupes de capture.
'The last logged on user was CONTOSO\jsmith' -match '(.+was )(.+)'
True
Utilisez la table de hachage $Matches variable automatique pour récupérer du texte capturé.
Le texte représentant l'ensemble de la correspondance est stocké dans la clé 0. Il est important de noter que la table de hachage $Matches contient uniquement la première occurrence d’un modèle correspondant.
$Matches.0
The last logged on user was CONTOSO\jsmith
Les captures sont stockées dans des entiers numériques avec des clés qui augmentent de gauche à droite. Capture 1 contient tout le texte jusqu'au nom d'utilisateur ; capture 2 contient uniquement le nom d'utilisateur.
$Matches
Name Value
---- -----
2 CONTOSO\jsmith
1 The last logged on user was
0 The last logged on user was CONTOSO\jsmith
Important
La clé 0 est un entier. Vous pouvez utiliser n'importe quelle méthode de table de hachage pour accéder à la valeur stockée.
PS> 'Good Dog' -match 'Dog'
True
PS> $Matches[0]
Dog
PS> $Matches.Item(0)
Dog
PS> $Matches.0
Dog
Captures nommées
Par défaut, les captures sont stockées dans l’ordre numérique croissant, de gauche à droite.
Vous pouvez également attribuer un nom à un groupe de capture. Ce nom devient une clé de la variable automatique $MatchesHashtable.
Dans un groupe de capture, utilisez ?<keyname> pour stocker les données capturées sous une clé nommée.
PS> $string = 'The last logged on user was CONTOSO\jsmith'
PS> $string -match 'was (?<domain>.+)\\(?<user>.+)'
True
PS> $Matches
Name Value
---- -----
domain CONTOSO
user jsmith
0 was CONTOSO\jsmith
PS> $Matches.domain
CONTOSO
PS> $Matches.user
jsmith
L’exemple suivant stocke la dernière entrée de journal dans le journal de sécurité Windows. L’expression régulière fournie extrait le nom d’utilisateur et le domaine du message et les stocke sous les clés :N pour le nom et le D pour le domaine.
$log = (Get-WinEvent -LogName Security -MaxEvents 1).Message
$r = '(?s).*Account Name:\s*(?<N>.*).*Account Domain:\s*(?<D>[A-Z,0-9]*)'
$log -match $r
True
$Matches
Name Value
---- -----
D CONTOSO
N jsmith
0 A process has exited...
Pour plus d'informations, voir Constructions de regroupement dans les expressions régulières.
Substitutions dans les expressions régulières
L’utilisation des expressions régulières (regex) avec l’opérateur -replace vous permet de remplacer dynamiquement du texte à l’aide de texte capturé.
<input> -replace <original>, <substitute>
-
<input>: La chaîne de caractères à rechercher -
<original>: expression régulière utilisée pour rechercher la chaîne d’entrée -
<substitute>: expression de substitution regex pour remplacer les correspondances trouvées dans la chaîne d’entrée.
Les opérandes <original> et <substitute> sont soumis à des règles du moteur d’expression régulière, telles que l’échappement de caractères ou les expressions de substitution. Le modèle de remplacement peut se composer d’une ou plusieurs substitutions avec des caractères littérals.
Les groupes de capture peuvent être référencés dans la chaîne <substitute> à l’aide du caractère $ avant l’identificateur de groupe.
Deux façons de référencer des groupes de capture sont par Nombre et par Nom.
Par numéro - Les groupes de capture sont numérotés de gauche à droite.
'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$1.$2.$3@contoso.com'John.D.Smith@contoso.comPar nom - Les groupes de capture peuvent également être référencés par leur nom.
'CONTOSO\Administrator' -replace '\w+\\(?<user>\w+)', 'FABRIKAM\${user}'FABRIKAM\Administrator
L'expression $& représente tout le texte correspondant.
'Gobble' -replace 'Gobble', '$& $&'
Gobble Gobble
Avertissement
Étant donné que le caractère $ est utilisé dans l'expansion des chaînes, vous devrez utiliser des chaînes littérales avec substitution ou échapper le caractère $ lorsque vous utilisez des guillemets doubles.
'Hello World' -replace '(\w+) \w+', '$1 Universe'
"Hello World" -replace "(\w+) \w+", "`$1 Universe"
Hello Universe
Hello Universe
En outre, si vous souhaitez que le $ soit un caractère littéral, utilisez $$ au lieu des caractères d’échappement normaux. Si vous utilisez des guillemets doubles, échappez toutes les occurrences de $ afin d'éviter une substitution incorrecte
'5.72' -replace '(.+)', '$$$1'
"5.72" -replace "(.+)", "`$`$`$1"
$5.72
$5.72
Pour plus d’informations sur les expressions de substitution, consultez Substitutions dans les expressions régulières.
Commentaires dans les expressions régulières
Les expressions régulières peuvent être très complexes et difficiles à lire. Vous pouvez utiliser des commentaires pour les rendre plus compréhensibles. Il existe deux types de commentaires autorisés dans les expressions régulières.
- Commentaire inline (
(?#)) - Commentaire de fin de ligne (
#)
Pour plus d'informations, consultez la section Commentaires dans les expressions régulières dans about_Comments.