À propos des expressions régulières
Description courte
Décrit les expressions régulières dans PowerShell.
Description longue
Notes
Cet article vous montre la syntaxe et les méthodes permettant d’utiliser des expressions régulières dans PowerShell, mais pas toutes les syntaxes sont abordées. Pour obtenir une référence plus complète, consultez le langage d’expression régulière - Référence rapide.
Une expression régulière est un modèle utilisé pour correspondre au texte. Il peut être constitué de caractères littérals, d’opérateurs et d’autres constructions.
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.
Les expressions régulières PowerShell ne respectent pas la casse par défaut. Chaque méthode indiquée ci-dessus a un moyen différent de forcer la sensibilité de la casse.
Méthode | Respect de la casse |
---|---|
Select-String |
utiliser -CaseSensitive le commutateur |
Instruction switch |
utiliser l’option -casesensitive |
opérateurs | préfixe avec 'c' (-cmatch , -csplit ou -creplace ) |
Littéraux de caractère
Une expression régulière peut être un caractère littéral ou une chaîne. L’expression provoque la correspondance du moteur avec le texte spécifié exactement.
# This statement returns true because book contains the string "oo"
'book' -match 'oo'
Classes de caractères
Bien que les littéraux de caractères fonctionnent si vous connaissez le modèle exact, les classes de caractères vous permettent d’être moins spécifiques.
Groupes de caractères
[character group]
vous permet de correspondre à un nombre quelconque de caractères une fois, tandis que [^character group]
seuls les caractères ne correspondent pas au 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 modèle peut également être une plage de caractères. Les caractères peuvent être alphabétiques [A-Z]
, numériques [0-9]
ou même 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 chiffre non décimal.
# This expression returns true if it matches a server name.
# (Server-01 - Server-99).
'Server-01' -match 'Server-\d\d'
Caractères word
La \w
classe de caractères correspond à n’importe quel caractère [a-zA-Z_0-9]
de mot . Pour faire correspondre n’importe quel caractère non-word, utilisez \W
.
# This expression returns true.
# The pattern matches the first word character 'B'.
'Book' -match '\w'
Caractères génériques
La période (.
) 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
L’espace blanc est mis en correspondance à l’aide de la \s
classe de caractères. Tout caractère non-blanc est mis en correspondance à l’aide \S
de . Les caractères ' '
d’espace littéral peuvent également être utilisés.
# This expression returns true.
# The pattern uses both methods to match the space.
' - ' -match '\s- '
Quantificateurs
Les quantificateurs contrôlent le nombre d’instances de chaque élément à présenter 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 que m de fois. |
L’astérisque (*
) correspond à l’élément précédent zéro ou plus de fois. Le résultat est 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 {n, m}
quantificateur 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 au n nombre de fois. |
{n,} |
Correspond au nombre minimum n de fois. |
{n,m} |
Correspondance entre n et m nombre de fois. |
# 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 provoquer une correspondance ou d’échouer en fonction de la position des correspondances 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 $
, qui correspond à la fin d’une chaîne. Les ancres vous permettent de faire correspondre votre texte à une position spécifique tout en ignorant également 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$'
Notes
Lors de la définition d’un regex contenant une $
ancre, veillez à placer le regex à l’aide de guillemets simples ('
) au lieu de guillemets doubles ("
) ou PowerShell développera l’expression en tant que variable.
Lorsque vous utilisez des ancres dans PowerShell, vous devez comprendre la différence entre les options d’expression régulière monoligne et multiligne .
- Multiligne : le mode multiligne force
^
et$
correspond à la fin de chaque ligne au lieu du début et de la fin de la chaîne d’entrée. - Singleline : le mode Singleline traite la chaîne d’entrée en tant que SingleLine.
Il force le
.
caractère à correspondre à chaque caractère (y compris les nouvelles lignes), au lieu de correspondre à chaque caractère À l’exception de la nouvelle ligne\n
.
Pour en savoir plus sur ces options et comment les utiliser, consultez le langage d’expression régulière - Référence rapide.
Caractères d’échappement
La barre oblique inverse (\
) est utilisée pour échapper des caractères afin qu’ils ne soient pas analysés par le moteur d’expression régulière.
Les caractères suivants sont réservés : []().\^$|?*+{}
.
Vous devez échapper à ces caractères dans vos modèles pour les faire correspondre dans 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,}
Notes
Cela permet d’échapper à 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 à l’utiliser uniquement sur la partie de votre modèle 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 correspondre aux types de caractères spéciaux.
Voici quelques échappements de caractères couramment utilisés :
Échappement de caractères | Description |
---|---|
\t |
Correspond à un onglet |
\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 entourée est capturé. L’exemple suivant décompose le texte d’entrée en deux groupes de capture.
'The last logged on user was CONTOSO\jsmith' -match '(.+was )(.+)'
True
Utilisez la variable automatique de hachage pour récupérer du $Matches
texte capturé.
Le texte représentant la correspondance entière est stocké à la clé 0
.
$Matches.0
The last logged on user was CONTOSO\jsmith
Les captures sont stockées dans des clés entières numériques qui augmentent de gauche à droite. La capture 1
contient tout le texte jusqu’à ce que le nom d’utilisateur, la capture 2
ne contient que 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 0
clé 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 affecter un nom à un groupe de capture. Ce nom devient une clé sur la $Matches
variable automatique de table de hachage.
À l’intérieur d’un groupe de capture, utilisez cette méthode ?<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 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 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, consultez Constructions de regroupement dans les expressions régulières.
Substitutions dans les expressions régulières
L’utilisation des expressions régulières avec l’opérateur vous permet de remplacer dynamiquement du texte à l’aide -replace
de texte capturé.
<input> -replace <original>, <substitute>
<input>
: chaîne à rechercher<original>
: expression régulière utilisée pour rechercher la chaîne d’entrée<substitute>
: expression de substitution d’expression régulière pour remplacer les correspondances trouvées dans la chaîne d’entrée.
Notes
Les opérandes et <substitute>
les <original>
opérandes sont soumis à des règles du moteur d’expression régulière, telles que l’échappement de caractères.
Les groupes de capture peuvent être référencés dans la <substitute>
chaîne. La substitution est effectuée à 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 nombre : 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.com
Par nom : les groupes de capture peuvent également être référencés par nom.
'CONTOSO\Administrator' -replace '\w+\\(?<user>\w+)', 'FABRIKAM\${user}'
FABRIKAM\Administrator
L’expression $&
représente tout le texte mis en correspondance.
'Gobble' -replace 'Gobble', '$& $&'
Gobble Gobble
Avertissement
Étant donné que le caractère est utilisé dans l’extension $
de chaîne, vous devez utiliser des chaînes littérales avec substitution ou échapper le $
caractère lors de l’utilisation de 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 avoir le $
caractère littéral, utilisez $$
plutôt que les caractères d’échappement normaux. Lorsque vous utilisez des guillemets doubles, échappez toujours toutes les instances de manière à éviter une $
substitution incorrecte.
'5.72' -replace '(.+)', '$$$1'
"5.72" -replace "(.+)", "`$`$`$1"
$5.72
$5.72
Pour plus d’informations, consultez Substitutions dans les expressions régulières.