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 erläutert, nicht die ganze Syntax wird erläutert. Eine vollständigere Referenz finden Sie in der Kurzreferenz zur Sprache für reguläre Ausdrücke.

Ein regulärer Ausdruck ist ein Muster, das für die Übereinstimmung mit Text verwendet wird. Sie kann aus Literalzeichen, Operatoren und anderen Konstrukten bestehen.

In diesem Artikel wird die Syntax für reguläre Ausdrücke in PowerShell veranschaulicht. PowerShell verfügt über mehrere Operatoren und Cmdlets, die reguläre Ausdrücke verwenden. Weitere Informationen zur Syntax und Verwendung finden Sie unter den folgenden Links.

Bei regulären PowerShell-Ausdrücken wird die Groß-/Kleinschreibung standardmäßig nicht beachtet. Jede oben gezeigte Methode verfügt über eine andere Möglichkeit, die Sensitivität der Fallart zu erzwingen.

Methode Groß- und Kleinschreibung
Select-String Switch -CaseSensitive verwenden
switch-Anweisung Verwenden der -casesensitive Option
Operatoren Präfix mit "c" ( -cmatch , oder -csplit -creplace )

Zeichenliterale

Ein regulärer Ausdruck kann ein Literalzeichen oder eine Zeichenfolge sein. Der Ausdruck bewirkt, dass die Engine genau mit dem angegebenen Text ab übereinstimmung.

# This statement returns true because book contains the string "oo"
'book' -match 'oo'

Zeichenklassen

Zeichenliterale funktionieren zwar, wenn Sie das genaue Muster kennen, aber Zeichenklassen ermöglichen es Ihnen, weniger spezifisch zu 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 übereinstimmt.

# 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 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 [A-Z] alphabetisch, 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 Dezimalstelle. Im Gegensatz dazu \D stimmt mit jeder Nicht-Dezimalziffer überein.

# This expression returns true if it matches a server name.
# (Server-01 - Server-99).
'Server-01' -match 'Server-\d\d'

Wortzeichen

Die \w Zeichenklasse stimmt mit jedem Wortzeichen [a-zA-Z_0-9] überein. Verwenden Sie , um alle Zeichen abzugleichen, die kein Wort \W sind.

# This expression returns true.
# The pattern matches the first word character 'B'.
'Book' -match '\w'

Platzhalter

Der Punkt ( . ) ist ein Platzhalterzeichen in regulären Ausdrücken. Es stimmt mit jedem Zeichen außer einem Newline \n () überein.

# This expression returns true.
# The pattern matches any 4 characters except the newline.
'a1\ ' -match '....'

Leerraum

Leerzeichen werden mithilfe der \s Zeichenklasse abgegleichen. Alle Zeichen, die keine Leerzeichen sind, werden mithilfe von \S abgegleichen. Literale Leerzeichen ' ' können ebenfalls verwendet werden.

# This expression returns true.
# The pattern uses both methods to match the space.
' - ' -match '\s- '

Quantifizierer

Quantifizierer steuern, wie viele Instanzen der einzelnen Elemente in der Eingabezeichenfolge vorhanden sein sollen.

Im Folgenden finden Sie einige der in PowerShell verfügbaren Quantifizierer:

Quantifizierer Beschreibung
* 0 (null) oder mehr Male.
+ Ein oder mehrere Male.
? Null oder einmal.
{n,m} Mindestens n , aber nicht mehr als m mal.

Das Sternchen ( * ) entspricht dem vorherigen Element 0 (null) oder mehrmals. Das Ergebnis ist, dass auch 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 ( + ) entspricht dem vorherigen Element ein oder mehrere Male.

# This returns true if it matches any server name.
'DC-01' -match '[A-Z]+-\d\d'

Das Fragezeichen ? entspricht dem vorherigen Element 0 (null) oder einmal. Wie ein Sternchen * gleicht es sogar Zeichenfolgen ab, 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 Weise 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} Übereinstimmung mit der n genauen Anzahl von Malen.
{n,} Übereinstimmung mit mindestens n der Anzahl von Malen.
{n,m} Übereinstimmung zwischen n und der Anzahl von m Malen.
# This returns true if it matches any phone number.
'111-222-3333' -match '\d{3}-\d{3}-\d{4}'

Anchors

Mit Ankern können Sie basierend auf der Übereinstimmungsposition innerhalb der Eingabezeichenfolge bewirken, dass eine Übereinstimmung erfolgreich ist oder fehlschlägt.

Die beiden häufig verwendeten Anker sind ^ und $ . Das Caret-Zeichen stimmt mit dem Anfang einer Zeichenfolge und dem Ende ^ $ einer Zeichenfolge ab. Die Anker ermöglichen es Ihnen, Ihren Text an einer bestimmten Position zu finden und gleichzeitig unerwünschte Zeichen zu verwerfen.

# The pattern expects the string 'fish' to be the only thing on the line.
# This returns FALSE.
'fishing' -match '^fish$'

Hinweis

Wenn Sie einen regex definieren, der einen Anker enthält, müssen Sie den regex mit einfachen Anführungszeichen ( ) anstelle von doppelten Anführungszeichen ( ) umschließen, oder PowerShell erweitert den Ausdruck als $ ' " Variable.

Wenn Sie Anker in PowerShell verwenden, sollten Sie den Unterschied zwischen Denline- und Mehrlineoptionen für reguläre Ausdrücke verstehen.

  • Mehrzeilenmodus: Der Mehrzeilenmodus erzwingt, dass und mit dem Anfangsende jeder ZEILE anstelle des Anfangs und Endes der ^ $ Eingabezeichenfolge übereinstimmen.
  • Singleline: Im Einzellinienmodus wird die Eingabezeichenfolge als SingleLine behandelt. Es erzwingt, dass das . Zeichen mit jedem Zeichen (einschließlich Neulinien) übereinstimmt, anstatt mit jedem Zeichen abzugleichen, mit AUSNAHME der Neulinie \n .

Weitere Informationen zu diesen Optionen und deren Verwendung finden Sie unter Sprache für reguläre Ausdrücke – Kurzübersicht.

Zeichen mit Escapezeichen

Der umgekehrte Schrägstrich \ () wird zum Escapezeichen verwendet, damit 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 umgehen, 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 mit Escapezeichen für Sie escapen kann.

[regex]::escape('3.\d{2,}')
3\.\\d\{2,}

Hinweis

Dadurch werden alle reservierten Zeichen für reguläre Ausdrücke mit Escapezeichen geschützt, einschließlich vorhandener umgekehrter Schrägstriche, die in Zeichenklassen verwendet werden. Achten Sie darauf, sie nur für den Teil Ihres Musters zu verwenden, den Sie mit Escapedaten versehen müssen.

Andere Zeichen-Escapezeichen

Es gibt auch reservierte Zeichen-Escapezeichen, die Sie zum Abgleichen von Sonderzeichentypen verwenden können.

Im Folgenden sind einige häufig verwendete Escapezeichen:

Escapezeichen Beschreibung
\t Entspricht einer Registerkarte
\n Entspricht einem Neuen
\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 Teilausdrucke bezeichnet. Standardmäßig werden Teilausdrucke in nummerierten Gruppen erfasst, aber Sie können ihnen auch Namen zuweisen.

Ein Gruppierungskonstrukt ist ein regulärer Ausdruck, der von Klammern umgeben ist. Jeder Text, der mit dem eingeschlossenen regulären Ausdruck abgefangen 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 Hashtabellenvariable, um erfassten Text abzurufen. Der Text, der die gesamte Übereinstimmung darstellt, wird im Schlüssel 0 gespeichert.

$Matches.0
The last logged on user was CONTOSO\jsmith

Erfassungen werden in numerischen Ganzzahlschlüsseln gespeichert, die von links nach rechts zunehmen. Capture 1 enthält den ganzen Text, bis der Benutzername, capture nur den Benutzernamen 2 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 zu zugreifen.

PS> 'Good Dog' -match 'Dog'
True

PS> $Matches[0]
Dog

PS> $Matches.Item(0)
Dog

PS> $Matches.0
Dog

Benannte Erfassungen

Erfassungen werden standardmäßig 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 in einer Erfassungsgruppe , ?<keyname> 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 Protokoll Windows-Sicherheit 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 Gruppierungskonstrukte 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 durch erfassten Text ersetzen.

<input> -replace <original>, <substitute>

  • <input>: Die zu durchsuchte Zeichenfolge
  • <original>: Ein regulärer Ausdruck, der zum Durchsuchen der Eingabezeichenfolge verwendet wird.
  • <substitute>: Ein regulärer Ausdrucksersetzungsausdruck zum Ersetzen von Übereinstimmungen, die in der Eingabezeichenfolge gefunden wurden.

Hinweis

Die <original> <substitute> Operanden und unterliegen Regeln der Engine für reguläre Ausdrücke, z. B. Zeichencaping.

Auf Erfassungsgruppen kann in der Zeichenfolge verwiesen <substitute> werden. Die Ersetzung erfolgt mithilfe des $ Zeichens vor dem Gruppenbezeichner.

Zwei Möglichkeiten, auf Erfassungsgruppen zu verweisen, sind nach Number 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: Auf Erfassungsgruppen kann auch anhand des Namens verwiesen werden.

    'CONTOSO\Administrator' -replace '\w+\\(?<user>\w+)', 'FABRIKAM\${user}'
    
    FABRIKAM\Administrator
    

Der $& Ausdruck stellt den gesamten übereinstimmende Text dar.

'Gobble' -replace 'Gobble', '$& $&'
Gobble Gobble

Warnung

Da das Zeichen bei der $ Zeichenfolgenerweiterung verwendet wird, müssen Sie Literalzeichenfolgen mit Ersetzung verwenden oder das $ Zeichen mit escapen, wenn Sie doppelte Anführungszeichen verwenden.

'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, escapen Sie dennoch alle Instanzen von , $ 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.

Weitere Informationen

about_Comparison_Operators

about_Operators