about_Regular_Expressions
Kurze Beschreibung
Beschreibt reguläre Ausdrücke in PowerShell.
Lange Beschreibung
Hinweis
In diesem Artikel werden die Syntax und die Methoden für die Verwendung regulärer Ausdrücke in PowerShell vorgestellt, nicht die gesamte Syntax wird erläutert. Eine ausführlichere Referenz finden Sie unter Regular Expression Language – Kurzreferenz.
Ein regulärer Ausdruck ist ein Muster, das zum Abgleichen von Text verwendet wird. Sie kann aus Literalzeichen, Operatoren und anderen Konstrukten bestehen.
In diesem Artikel wird die Syntax regulärer Ausdrücke in PowerShell veranschaulicht. PowerShell verfügt über mehrere Operatoren und Cmdlets, die reguläre Ausdrücke verwenden. Weitere Informationen zu deren Syntax und Verwendung finden Sie unter den folgenden Links.
- Select-String
- Operatoren "-match" und "-replace"
- -split-Operator
- switch-Anweisung mit option "-regex"
Bei regulären PowerShell-Ausdrücken wird standardmäßig nicht zwischen Groß- und Kleinschreibung unterschieden. Jede oben gezeigte Methode hat eine andere Möglichkeit, die Groß-/Kleinschreibung zu erzwingen.
- Verwenden Sie für
Select-String
den Parameter CaseSensitive . - Verwenden Sie für Operatoren, die reguläre Ausdrücke verwenden, die Groß-/Kleinschreibung beachten:
-cmatch
,-creplace
oder-csplit
- Verwenden Sie für die
switch
-Anweisung die-casesensitive
-Option.
Zeichenliterale
Ein regulärer Ausdruck kann ein Literalzeichen oder eine Zeichenfolge sein. Der Ausdruck bewirkt, dass die Engine genau mit dem angegebenen Text übereinstimmt.
# This statement returns true because book contains the string "oo"
'book' -match 'oo'
Zeichenklassen
Während Zeichenliterale funktionieren, wenn Sie das genaue Muster kennen, können Sie mit Zeichenklassen weniger spezifisch sein.
Zeichengruppen
[character group]
ermöglicht es Ihnen, eine beliebige Anzahl von Zeichen einmal zuzuordnen, während [^character group]
nur Zeichen, die NICHT in der Gruppe enthalten sind, übereinstimmen.
# This expression returns true if the pattern matches big, bog, or bug.
'big' -match 'b[iou]g'
Wenn die Liste der abzugleichenden Zeichen den Bindestrich (-
) enthält, muss es sich am Anfang oder Ende der Liste befinden, um es von einem Zeichenbereichsausdruck zu unterscheiden.
Zeichenbereiche
Ein Muster kann auch ein Zeichenbereich sein. Die Zeichen können alphabetisch [A-Z]
, numerisch [0-9]
oder sogar ASCII-basiert [ -~]
sein (alle druckbaren Zeichen).
# This expression returns true if the pattern matches any 2 digit number.
42 -match '[0-9][0-9]'
Zahlen
Die \d
Zeichenklasse entspricht einer beliebigen Dezimalzahl. Entspricht \D
umgekehrt jeder nicht dezimalen Ziffer.
# This expression returns true if it matches a server name.
# (Server-01 - Server-99).
'Server-01' -match 'Server-\d\d'
Word-Zeichen
Die \w
Zeichenklasse entspricht einem beliebigen Wortzeichen [a-zA-Z_0-9]
. Verwenden Sie , um ein beliebiges Nicht-Wort-Zeichen zuzuordnen \W
.
# This expression returns true.
# The pattern matches the first word character 'B'.
'Book' -match '\w'
Platzhalter
Der Punkt (.
) ist ein Wildcardzeichen in regulären Ausdrücken. Es entspricht einem beliebigen Zeichen außer einem Zeilenumbruch (\n
).
# This expression returns true.
# The pattern matches any 4 characters except the newline.
'a1\ ' -match '....'
Leerraum
Leerzeichen werden mithilfe der \s
Zeichenklasse abgeglichen. Alle Zeichen, die keine Leerzeichen sind, werden mit \S
abgeglichen. Es können auch Literale Leerzeichen ' '
verwendet werden.
# This expression returns true.
# The pattern uses both methods to match the space.
' - ' -match '\s- '
Quantifizierer
Quantifizierer steuern, wie viele Instanzen jedes Elements in der Eingabezeichenfolge vorhanden sein sollen.
Im Folgenden finden Sie einige der in PowerShell verfügbaren Quantifizierer:
Quantifizierer | Beschreibung |
---|---|
* |
0 oder mehr Mal. |
+ |
Ein oder mehrere Male. |
? |
0 oder einmal. |
{n,m} |
Zumindest n , aber nicht mehr als m mal. |
Das Sternchen (*
) entspricht dem vorherigen Element 0 oder mehr Mal. Das Ergebnis ist, dass selbst eine Eingabezeichenfolge ohne das -Element eine Übereinstimmung wäre.
# This returns true for all account name strings even if the name is absent.
'ACCOUNT NAME: Administrator' -match 'ACCOUNT NAME:\s*\w*'
Das Pluszeichen (+
) stimmt einmal oder mehrmals mit dem vorherigen Element überein.
# This returns true if it matches any server name.
'DC-01' -match '[A-Z]+-\d\d'
Das Fragezeichen ?
entspricht dem vorherigen Element 0 oder einmal. Wie das Sternchen *
stimmt es sogar mit Zeichenfolgen überein, bei denen das Element nicht vorhanden ist.
# This returns true for any server name, even server names without dashes.
'SERVER01' -match '[A-Z]+-?\d\d'
Der {n, m}
Quantifizierer kann auf verschiedene Arten verwendet werden, um eine präzise Kontrolle über den Quantifizierer zu ermöglichen. Das zweite Element m
und das Komma ,
sind optional.
Quantifizierer | Beschreibung |
---|---|
{n} |
Entspricht genau n der Anzahl der Male. |
{n,} |
Stimmen Sie mindestens n mit der Anzahl von Übereinstimmungen überein. |
{n,m} |
Übereinstimmung zwischen n und m Anzahl der Male. |
# This returns true if it matches any phone number.
'111-222-3333' -match '\d{3}-\d{3}-\d{4}'
Anchors
Mithilfe von Anchors können Sie basierend auf der Übereinstimmungsposition innerhalb der Eingabezeichenfolge eine erfolgreiche Übereinstimmung oder einen Fehler verursachen.
Die beiden häufig verwendeten Anker sind ^
und $
. Das Caret ^
entspricht dem Anfang einer Zeichenfolge und $
, der dem Ende einer Zeichenfolge entspricht. Mit den Ankern können Sie Ihren Text an einer bestimmten Position abgleichen und gleichzeitig unerwünschte Zeichen verwerfen.
# The pattern expects the string 'fish' to be the only thing on the line.
# This returns FALSE.
'fishing' -match '^fish$'
Hinweis
Achten Sie beim Definieren eines RegEx mit einem $
Anker darauf, den Regex in einfache Anführungszeichen ('
) anstelle von doppelten Anführungszeichen ("
) einzuschließen. Andernfalls erweitert PowerShell den Ausdruck als Variable.
Wenn Sie Anker in PowerShell verwenden, sollten Sie den Unterschied zwischen den Optionen für reguläre Ausdrücke mit singleline und Multiline kennen.
- Mehrzeilige: Der Mehrzeilige Modus erzwingt
^
und$
entspricht dem Anfangsende jeder ZEILE anstelle des Anfangs- und Endes der Eingabezeichenfolge. - Singleline: Der Singleline-Modus behandelt die Eingabezeichenfolge als SingleLine.
Es erzwingt, dass das
.
Zeichen mit jedem Zeichen (einschließlich Zeilenumbrüchen) übereinstimmt, anstatt jedes Zeichen MIT AUSNAHME des Zeilenumbruchs\n
abzugleichen.
Weitere Informationen zu diesen Optionen und deren Verwendung finden Sie unter Regular Expression Language – Kurzreferenz.
Zeichen mit Escapezeichen
Der umgekehrte Schrägstrich (\
) wird verwendet, um Zeichen zu escapen, sodass sie nicht von der Engine für reguläre Ausdrücke analysiert werden.
Die folgenden Zeichen sind reserviert: []().\^$|?*+{}
.
Sie müssen diese Zeichen in Ihren Mustern mit Escapezeichen versehen, um sie in Ihren Eingabezeichenfolgen abzugleichen.
# 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,}'
Es gibt eine statische Methode der regex-Klasse, die Text für Sie mit Escapezeichen versehen kann.
[regex]::escape('3.\d{2,}')
3\.\\d\{2,}
Hinweis
Dadurch werden alle reservierten Zeichen für reguläre Ausdrücke mit Escapezeichen versehen, einschließlich vorhandener umgekehrter Schrägstriche, die in Zeichenklassen verwendet werden. Achten Sie darauf, dass Sie es nur für den Teil Ihres Musters verwenden, den Sie als Escapezeichen benötigen.
Escapezeichen für andere Zeichen
Es gibt auch reservierte Escapezeichen, die Sie verwenden können, um Sonderzeichentypen abzugleichen.
Im Folgenden sind einige häufig verwendete Zeichen escapezeichen aufgeführt:
Escapezeichen | BESCHREIBUNG |
---|---|
\t |
Entspricht einer Registerkarte |
\n |
Entspricht einem Zeilenumbruch |
\r |
Entspricht einem Wagenrücklauf |
Gruppen, Erfassungen und Ersetzungen
Gruppierungskonstrukte trennen eine Eingabezeichenfolge in Teilzeichenfolgen, die erfasst oder ignoriert werden können. Gruppierte Teilzeichenfolgen werden als Teilausdrücke bezeichnet. Standardmäßig werden Teilausdrücke in nummerierten Gruppen erfasst, obwohl Sie ihnen auch Namen zuweisen können.
Ein Gruppierungskonstrukt ist ein regulärer Ausdruck, der von Klammern umgeben ist. Jeder Text, der vom eingeschlossenen regulären Ausdruck abgeglichen wird, wird erfasst. Im folgenden Beispiel wird der Eingabetext in zwei Erfassungsgruppen unterteilt.
'The last logged on user was CONTOSO\jsmith' -match '(.+was )(.+)'
True
Verwenden Sie die $Matches
automatische Hashtable-Variable, um erfassten Text abzurufen.
Der Text, der die gesamte Übereinstimmung darstellt, wird am Schlüssel 0
gespeichert. Es ist wichtig zu beachten, dass die $Matches
Hashtabelle nur das erste Vorkommen eines übereinstimmenden Musters enthält.
$Matches.0
The last logged on user was CONTOSO\jsmith
Erfassungen werden in numerischen Ganzzahlschlüsseln gespeichert, die von links nach rechts erhöht werden. Capture 1
enthält den gesamten Text, bis der Benutzername, capture 2
nur den Benutzernamen enthält.
$Matches
Name Value
---- -----
2 CONTOSO\jsmith
1 The last logged on user was
0 The last logged on user was CONTOSO\jsmith
Wichtig
Der 0
Schlüssel ist eine Ganze Zahl. Sie können eine beliebige Hashtable-Methode verwenden, um auf den gespeicherten Wert zuzugreifen.
PS> 'Good Dog' -match 'Dog'
True
PS> $Matches[0]
Dog
PS> $Matches.Item(0)
Dog
PS> $Matches.0
Dog
Named Captures
Standardmäßig werden Aufzeichnungen in aufsteigender numerischer Reihenfolge von links nach rechts gespeichert.
Sie können einer Erfassungsgruppe auch einen Namen zuweisen. Dieser Name wird zu einem Schlüssel für die $Matches
automatische Hashtabellenvariable.
Verwenden Sie ?<keyname>
innerhalb einer Erfassungsgruppe, um erfasste Daten unter einem benannten Schlüssel zu speichern.
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
Im folgenden Beispiel wird der neueste Protokolleintrag im Windows-Sicherheit Protokoll gespeichert. Der bereitgestellte reguläre Ausdruck extrahiert den Benutzernamen und die Domäne aus der Nachricht und speichert sie unter den Schlüsseln:N für Name und D für Domäne.
$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....
Weitere Informationen finden Sie unter Gruppieren von Konstrukten in regulären Ausdrücken.
Ersetzungen in regulären Ausdrücken
Wenn Sie die regulären Ausdrücke mit dem -replace
Operator verwenden, können Sie Text dynamisch mithilfe von erfasstem Text ersetzen.
<input> -replace <original>, <substitute>
<input>
: Die zu durchsuchende Zeichenfolge<original>
: Ein regulärer Ausdruck, der zum Durchsuchen der Eingabezeichenfolge verwendet wird<substitute>
: Ein Ersetzungsausdruck für reguläre Ausdrücke zum Ersetzen von Übereinstimmungen, die in der Eingabezeichenfolge gefunden wurden.
Hinweis
Die <original>
Operanden und <substitute>
unterliegen regeln die Engine für reguläre Ausdrücke, z. B. das Escapen von Zeichen.
Auf Erfassungsgruppen kann in der <substitute>
Zeichenfolge verwiesen werden. Die Ersetzung erfolgt mithilfe des $
Zeichens vor dem Gruppenbezeichner.
Zwei Möglichkeiten, auf Erfassungsgruppen zu verweisen, sind nach Zahl und nach Name.
Nach Zahl : Erfassungsgruppen werden von links nach rechts nummeriert.
'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$1.$2.$3@contoso.com'
John.D.Smith@contoso.com
Nach Name : Die Erfassung von Gruppen kann auch anhand des Namens referenziert werden.
'CONTOSO\Administrator' -replace '\w+\\(?<user>\w+)', 'FABRIKAM\${user}'
FABRIKAM\Administrator
Der $&
Ausdruck stellt den gesamten zugeordneten Text dar.
'Gobble' -replace 'Gobble', '$& $&'
Gobble Gobble
Warnung
Da das Zeichen in der $
Zeichenfolgenerweiterung verwendet wird, müssen Sie Literalzeichenfolgen mit Ersetzung verwenden oder das $
Zeichen bei verwendung doppelter Anführungszeichen mit Escapezeichen versehen.
'Hello World' -replace '(\w+) \w+', '$1 Universe'
"Hello World" -replace "(\w+) \w+", "`$1 Universe"
Hello Universe
Hello Universe
Wenn Sie darüber $
hinaus als Literalzeichen verwenden möchten, verwenden Sie $$
anstelle der normalen Escapezeichen. Wenn Sie doppelte Anführungszeichen verwenden, können Sie dennoch alle Instanzen von $
mit Escapezeichen versehen, um eine falsche Ersetzung zu vermeiden.
'5.72' -replace '(.+)', '$$$1'
"5.72" -replace "(.+)", "`$`$`$1"
$5.72
$5.72
Weitere Informationen finden Sie unter Ersetzungen in regulären Ausdrücken.