about_Regular_Expressions
Kurze Beschreibung
Beschreibt reguläre Ausdrücke in PowerShell.
Lange Beschreibung
Hinweis
In diesem Artikel werden die Syntax und Methoden für die Verwendung regulärer Ausdrücke in PowerShell erläutert. Es deckt nicht alle möglichen Ausdrücke ab. Eine ausführlichere Referenz finden Sie in der Sprache für reguläre Ausdrücke – Kurzübersicht.
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 nachstehenden Links.
Bei regulären PowerShell-Ausdrücken wird standardmäßig die Groß-/Kleinschreibung beachtet. Jede oben gezeigte Methode hat eine andere Möglichkeit, die Groß-/Kleinschreibung zu erzwingen.
- Verwenden Sie für
Select-String
diesen Parameter den Parameter CaseSensitive . - Verwenden Sie für Operatoren, die reguläre Ausdrücke verwenden, die Groß-/Kleinschreibung beachten:
-cmatch
, , oder-creplace
-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 das Modul exakt 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 Zeichenklassen weniger spezifisch sein.
Zeichengruppen
[character group]
ermöglicht es Ihnen, eine beliebige Anzahl von Zeichen einmal abzugleichen, während [^character group]
nur zeichen NICHT in der Gruppe übereinstimmen.
# This expression returns true if the pattern matches big, bog, or bug.
'big' -match 'b[iou]g'
Wenn ihre Liste der übereinstimmenden Zeichen den Bindestrich (-
) enthält, muss sie sich am Anfang oder Ende der Liste befinden, um sie 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 jeder Dezimalziffer. Im Gegensatz dazu \D
stimmen alle nicht dezimalen Ziffern überein.
# 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 jedem Wortzeichen [a-zA-Z_0-9]
. Verwenden Sie \W
zum Abgleichen eines wortfremden Zeichens .
# 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 einer Neuen Zeile (\n
).
# This expression returns true.
# The pattern matches any 4 characters except the newline.
'a1\ ' -match '....'
Leerzeichen
Sie können jedem Leerzeichen mit der \s
Zeichenklasse entsprechen. Sie können mit jedem Nicht-Leerzeichenzeichen übereinstimmen.\S
Sie können literale Leerzeichen mit
.
# 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- '
Quantifizierer
Quantifizierer steuern, wie viele Instanzen jedes Elements in der Eingabezeichenfolge vorhanden sein sollen.
Im Folgenden sind einige der Quantifizierer aufgeführt, die in PowerShell verfügbar sind:
Quantifizierer | Beschreibung |
---|---|
* |
Null oder mehr Mal. |
+ |
Mindestens ein Mal. |
? |
Null oder einmal. |
{n,m} |
Zumindest n , aber nicht mehr als m mal. |
Das Sternchen (*
) entspricht dem vorherigen Element null oder mehr Mal. Das Ergebnis ist, dass selbst eine Eingabezeichenfolge ohne das Element eine Übereinstimmung sein würde.
# This returns true for all account name strings even if the name is absent.
'ACCOUNT NAME: Administrator' -match 'ACCOUNT NAME:\s*\w*'
Das Pluszeichen (+
) entspricht einem oder mehreren Mal dem vorherigen Element.
# 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 ein 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} |
Stimmen Sie genau n die Anzahl der Male überein. |
{n,} |
Mindestens n anzahl der Übereinstimmungen. |
{n,m} |
Übereinstimmung zwischen n und m Häufigkeit. |
# This returns true if it matches any phone number.
'111-222-3333' -match '\d{3}-\d{3}-\d{4}'
Anchors
Anker ermöglichen es Ihnen, eine Übereinstimmung basierend auf der Übereinstimmungsposition innerhalb der Eingabezeichenfolge erfolgreich zu machen oder fehlzuschlagen.
Die beiden häufig verwendeten Anker sind ^
und $
. Das Caret ^
entspricht dem Anfang einer Zeichenfolge und $
, die 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
Beim Definieren eines Regulären Ausdrucks, der einen Anker ($
) enthält, sollten Sie den regex in einfache Anführungszeichen ('
) einschließen. Wenn Sie doppelte Anführungszeichen ("
) verwenden, interpretiert PowerShell die Zeichenfolge als erweiterbaren Variablenausdruck.
Bei der Verwendung von Ankern in PowerShell sollten Sie den Unterschied zwischen den Optionen für reguläre Ausdrücke mit singleline und Multiline verstehen.
- Multiline: Multiline-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 jedem Zeichen (einschließlich Neuerlinien) entspricht, anstatt jedes Zeichen außer der Neuen Zeile\n
abzugleichen.
Weitere Informationen zu diesen Optionen und deren Verwendung finden Sie in der Sprache für reguläre Ausdrücke – Kurzübersicht.
Zeichen mit Escapezeichen
Der umgekehrte Schrägstrich (\
) wird zum Escapezeichen verwendet, sodass sie nicht vom Regulären Ausdrucksmodul analysiert werden.
Die folgenden Zeichen sind reserviert: []().\^$|?*+{}
.
Sie müssen diese Zeichen in Ihren Mustern escapen, 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 escapen kann.
[regex]::escape('3.\d{2,}')
3\.\\d\{2,}
Hinweis
Dadurch werden alle reservierten regulären Ausdruckszeichen, einschließlich vorhandener umgekehrter Schrägstriche, die in Zeichenklassen verwendet werden, escapes. Achten Sie darauf, es nur für den Teil Ihres Musters zu verwenden, den Sie escapen müssen.
Andere Zeichen escapes
Es gibt auch reservierte Zeichen escapes, die Sie verwenden können, um Sonderzeichentypen zuzuordnen.
Im Folgenden sind einige häufig verwendete Zeichen escapes aufgeführt:
Zeichen escape | Beschreibung |
---|---|
\t |
Entspricht einer Registerkarte |
\n |
Entspricht einer Neuen zeile |
\r |
Entspricht einer Wagenrücklauf |
Gruppen, Erfassungen und Ersetzungen
Durch gruppieren wird eine Eingabezeichenfolge in Teilzeichenfolgen getrennt, die erfasst oder ignoriert werden können. Gruppierte Teilzeichenfolgen werden als Unterausdrücke bezeichnet. Standardmäßig werden Unterausdrücke in nummerierten Gruppen erfasst, sie können ihnen jedoch auch Namen zuweisen.
Ein Gruppierungskonstrukt ist ein regulärer Ausdruck, der von Klammern umgeben ist. Jeder Text, der mit dem eingeschlossenen regulären Ausdruck übereinstimmt, wird erfasst. Im folgenden Beispiel wird der Eingabetext in zwei Aufnahmegruppen umgebrochen.
'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 bei Schlüssel 0
gespeichert. Es ist wichtig zu beachten, dass die Hashtabelle $Matches
nur das erste Vorkommen eines übereinstimmenden Musters enthält.
$Matches.0
The last logged on user was CONTOSO\jsmith
Aufzeichnungen werden in numerischen Ganzzahltasten gespeichert, die von links nach rechts steigen. Die Erfassung 1
enthält den gesamten Text, bis der Benutzername, die Aufnahme 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 jede 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
Benannte Erfassungen
Standardmäßig werden Aufzeichnungen in aufsteigender numerischer Reihenfolge von links nach rechts gespeichert.
Sie können einer Aufnahmegruppe auch einen Namen zuweisen. Dieser Name wird zu einem Schlüssel für die $Matches
automatische Hashtable-Variable .
Verwenden Sie ?<keyname>
in einer Aufzeichnungsgruppe, 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-EventLog -LogName Security -Newest 1 -InstanceId 4689).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 Gruppierungskonstrukte in regulären Ausdrücken.
Ersetzungen in regulären Ausdrücken
Mithilfe der regulären Ausdrücke (regex) mit dem -replace
Operator können Sie Text mithilfe von erfassten Text dynamisch ersetzen.
<input> -replace <original>, <substitute>
<input>
: Die zu durchsuchende Zeichenfolge<original>
: Ein regulärer Ausdruck, der zum Durchsuchen der Eingabezeichenfolge verwendet wird<substitute>
: Ein regex-Ersetzungsausdruck zum Ersetzen von Übereinstimmungen in der Eingabezeichenfolge.
Die <original>
Und <substitute>
Operanden unterliegen Regeln des Regulären Ausdrucksmoduls, z. B. Ausweich- oder Ersetzungsausdrücke. Das Ersetzungsmuster kann zusammen mit Literalzeichen aus einer oder mehreren Ersetzungen bestehen.
Auf Erfassungsgruppen kann mithilfe des $
Zeichens vor dem Gruppenbezeichner in der <substitute>
Zeichenfolge verwiesen werden.
Zwei Methoden zum Verweisen auf Aufzeichnungsgruppen lauten "Zahl" und "Name".
Nach Zahl – Die Erfassung von Gruppen wird von links nach rechts nummeriert.
'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$1.$2.$3@contoso.com'
John.D.Smith@contoso.com
Nach Name – Erfassungsgruppen können auch anhand des Namens referenziert werden.
'CONTOSO\Administrator' -replace '\w+\\(?<user>\w+)', 'FABRIKAM\${user}'
FABRIKAM\Administrator
Der $&
Ausdruck stellt den gesamten übereinstimmenen Text dar.
'Gobble' -replace 'Gobble', '$& $&'
Gobble Gobble
Warnung
Da das $
Zeichen in der Zeichenfolgenerweiterung verwendet wird, müssen Sie literale Zeichenfolgen mit Ersetzung verwenden oder das $
Zeichen beim Verwenden von doppelten Anführungszeichen escapen.
'Hello World' -replace '(\w+) \w+', '$1 Universe'
"Hello World" -replace "(\w+) \w+", "`$1 Universe"
Hello Universe
Hello Universe
Wenn Sie zusätzlich das $
Als Literalzeichen verwenden möchten, verwenden $$
Sie anstelle der normalen Escapezeichen. Wenn Doppelte Anführungszeichen verwendet werden, vermeiden Sie dennoch alle Instanzen, um $
eine falsche Ersetzung zu vermeiden.
'5.72' -replace '(.+)', '$$$1'
"5.72" -replace "(.+)", "`$`$`$1"
$5.72
$5.72
Ausführliche Informationen zu Ersetzungsausdrücken finden Sie unter Ersetzungen in regulären Ausdrücken.