Share via


about_Regular_Expressions

Description courte

Décrit les expressions régulières dans PowerShell.

Description longue

Notes

Cet article vous montre la syntaxe et les méthodes d’utilisation d’expressions régulières dans PowerShell. La syntaxe n’est pas toutes abordée. Pour obtenir des informations de référence plus complètes, consultez Le langage d’expression régulière - Référence rapide.

Une expression régulière est un modèle utilisé pour faire correspondre du texte. Il peut être composé 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. Pour en savoir plus sur leur syntaxe et leur utilisation, consultez les liens ci-dessous.

Par défaut, les expressions régulières PowerShell ne respectent pas la casse. Chaque méthode illustrée ci-dessus a une façon différente de forcer la confidentialité de la casse.

Méthode Respect de la casse
Select-String utiliser le -CaseSensitive 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 fait que le moteur correspond exactement au texte spécifié.

# 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écifique.

Groupes de caractères

[character group] vous permet de faire correspondre un nombre quelconque de caractères une fois, tandis que [^character group] ne correspond qu’à des 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 trait d’union (-), elle doit se trouver au début ou à la fin de la liste pour la 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 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'

Word caractères

La \w classe de caractères correspond à n’importe quel caractère de [a-zA-Z_0-9]mot . Pour faire correspondre un caractère autre que le 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

Les espaces blancs sont mis en correspondance à l’aide de la \s classe de caractères. Tous les caractères autres que les espaces blancs sont mis en correspondance à l’aide de \S. Vous pouvez également utiliser des espaces ' ' littérals.

# 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 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 que m des fois.

L’astérisque (*) correspond à l’élément précédent zéro ou plusieurs 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 l’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 n au nombre de fois.
{n,} Faire correspondre au moins n le nombre 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 d’entraîner la réussite ou l’échec d’une correspondance 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 écartant 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 entre guillemets simples (') au lieu de guillemets doubles (") ou PowerShell développe 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 $ à faire correspondre l’extrémité de début 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 comme une ligne unique. Il force le . caractère à correspondre à chaque caractère (y compris les nouvelles lignes), au lieu de correspondre à chaque caractère, SAUF la nouvelle ligne \n.

Pour en savoir plus sur ces options et sur leur utilisation, consultez Le langage d’expression régulière - Référence rapide.

Caractères d’échappement

La barre oblique inverse (\) est utilisée pour les caractères d’échappement 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 devrez é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 vous échapper du texte.

[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 à laquelle vous avez besoin d’é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.

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

Les constructions de regroupement séparent une chaîne d’entrée en sous-chaînes qui peuvent être capturées ou ignorées. 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, même si vous pouvez également leur attribuer des noms.

Une construction de regroupement est une expression régulière entourée de parenthèses. Tout texte correspondant à l’expression régulière placée est capturé. L’exemple suivant divise 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 le $Matches texte capturé. Le texte représentant la correspondance entière est stocké à la clé 0. Il est important de noter que la table de $Matches hachage contient uniquement la première occurrence d’un modèle de correspondance.

$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. Capture 1 contient tout le texte jusqu’à ce que le nom d’utilisateur, la capture 2 ne contienne 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 Hashtable 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é sur la $Matches variable automatique hashtable.

À l’intérieur d’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 l’entrée de journal la plus récente 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 nom et D pour 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 -replace vous permet de remplacer dynamiquement du texte à l’aide du 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 <original> opérandes et <substitute> sont soumis aux règles du moteur d’expression régulière, telles que l’échappement de caractères.

La capture de groupes peut être référencée 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 les groupes de capture sont par nombre et par nom.

  • Par nombre : la capture des Groupes sont numérotées de gauche à droite.

    'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$1.$2.$3@contoso.com'
    
    John.D.Smith@contoso.com
    
  • Par nom : la capture de Groupes peut également être référencée par 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’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 comme $ caractère littéral, utilisez $$ au lieu des caractères d’échappement normaux. Lorsque vous utilisez des guillemets doubles, échappez toujours toutes les instances de $ pour é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.

Voir aussi