Freigeben über


about_Regular_Expressions

Kurzbeschreibung

Beschreibt reguläre Ausdrücke in PowerShell.

Lange Beschreibung

Anmerkung

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 Kurzreferenz für reguläre Ausdrücke.

Ein regulärer Ausdruck ist ein Muster, das zum Abgleichen von Text verwendet wird. Sie kann aus Literalzeichen, Operatoren und anderen Konstrukten bestehen. PowerShell verwendet die .NET Regex-Engine.

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.

Reguläre Ausdrücke in der PowerShell unterscheiden standardmäßig nicht zwischen Groß- und Kleinschreibung. Jede der oben gezeigten Methoden bietet eine andere Möglichkeit, die Groß- und Kleinschreibung zu erzwingen.

  • Verwenden Sie für Select-Stringden parameter CaseSensitive.
  • Für Operatoren, die reguläre Ausdrücke verwenden, verwenden Sie die vertrauliche Version: -cmatch, -creplace, oder -csplit
  • Für die switch-Anweisung verwenden Sie die -CaseSensitive-Option

Zeichenliterale

Ein regulärer Ausdruck kann ein wörtliches Zeichen oder eine Zeichenfolge sein. Der Ausdruck veranlasst die Engine, den angegebenen Text genau abzugleichen.

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

Zeichenklassen

Während Zeichenliterale gut funktionieren, wenn Sie das genaue Muster kennen, ermöglichen es Ihnen Zeichenklassen, weniger spezifisch zu sein.

Zeichengruppen

[character group] bietet Ihnen die Möglichkeit, eine beliebige Anzahl von Zeichen auf einmal abzugleichen, während [^character group] nur Zeichen abgleicht, die NICHT in der Gruppe enthalten sind.

# 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 er sich am Anfang oder Ende der Liste befinden, um ihn von einem Zeichenbereichsausdruck zu unterscheiden.

Zeichenbereiche

Ein Muster kann auch aus einem Bereich von Zeichen bestehen. Die Zeichen können alphabetisch [A-Z], numerische [0-9]oder sogar ASCII-basierte [ -~] (alle druckbaren Zeichen) sein.

# This expression returns true if the pattern matches any 2 digit number.
42 -match '[0-9][0-9]'

Zahlen

Die \d Zeichenklasse entspricht einer dezimalen Ziffer. Umgekehrt entspricht \D einem beliebigen Zeichen mit Ausnahme von Dezimalziffern.

# 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 \W, um einem wortfremden Zeichen zu entsprechen.

# 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. Er passt auf jedes Zeichen außer einem Zeilenumbruch (\n).

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

Leerzeichen

Mit der Zeichenklasse \s können Sie jedes beliebige Leerzeichen abgleichen. Sie können jedes Nicht-Leerzeichen mit \S abgleichen. Sie können echte Leerzeichen mit abgleichen.

# 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:

Quantifikator Beschreibung
* Null oder mehrere Male.
+ Ein- oder mehrmals.
? Null oder ein Mal.
{n,m} Mindestens 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 ? passt auf das vorherige Element null oder einmal. Wie sternchen *entspricht es sogar Zeichenfolgen, 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.

Quantifikator Beschreibung
{n} EXAKT n Übereinstimmungen.
{n,} MINDESTENS n Übereinstimmungen.
{n,m} Entspricht zwischen n und m Übereinstimmungen.
# This returns true if it matches any phone number.
'111-222-3333' -match '\d{3}-\d{3}-\d{4}'

Anker

Anker bieten Ihnen die Möglichkeit, eine Übereinstimmung abhängig von der Position innerhalb der Zeichenfolge zuzulassen oder nicht.

Die beiden häufig verwendeten Anker sind ^ und $. Das Caret ^ steht für den Anfang einer Zeichenfolge und $ für das Ende einer Zeichenfolge. 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$'

Anmerkung

Wenn Sie eine Regex definieren, die einen Anker ($ ) enthält, sollten Sie die 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 Singleline und Multiline für reguläre Ausdrücke verstehen.

  • Mehrzeilig: Der mehrzeilige Modus zwingt ^ und $ dazu, den Anfang und das Ende jeder Zeile abzugleichen, anstatt den Anfang und das Ende der Eingangszeichenfolge.
  • Singleline: Der Singleline-Modus behandelt die Zeichenfolge wie eine SingleLine. Er erzwingt, dass das Zeichen . auf jedes Zeichen (einschließlich Zeilenumbrüche) passt, anstatt auf jedes Zeichen AUSSER dem Zeilenumbruch \n.

Weitere Informationen zu diesen Optionen und ihrer Verwendung finden Sie in der Kurzreferenz zur Sprache der regulären Ausdrücke.

Escapezeichen

Der Backslash (\) wird verwendet, um Zeichen zu maskieren, damit sie von der Engine für reguläre Ausdrücke nicht geparst werden.

Die folgenden Zeichen sind reserviert: [().\^$|?*+{.

Sie müssen diese Zeichen in Ihren Mustern maskieren, um sie in Ihren Zeichenfolgen zu finden.

# 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 Klasse regex, die Text für Sie maskieren kann.

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

Anmerkung

Diese maskiert alle reservierten Zeichen für reguläre Ausdrücke, einschließlich der in Zeichenklassen verwendeten Backslashes. Achten Sie darauf, dass Sie diese Methode nur für den Teil Ihres Musters verwenden, den Sie maskieren müssen.

Andere Maskierungen von Zeichen

Es gibt auch reservierte Zeichen-Maskierungen, die Sie verwenden können, um spezielle Zeichentypen zu finden.

Im Folgenden finden Sie einige häufig verwendete Zeichen-Maskierungen:

Zeichen-Maskierung Beschreibung
\t Entspricht einem Tabulator
\n Entspricht einem Zeilenumbruch
\r Entspricht einem 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 Erfassungsgruppen aufgeteilt.

'The last logged on user was CONTOSO\jsmith' -match '(.+was )(.+)'
True

Verwenden Sie die $MatchesHashtable- automatische Variable, um erfassten Text abzurufen. Der Text, der die gesamte Übereinstimmung darstellt, wird unter der Schlüssel 0 gespeichert. Es ist wichtig zu beachten, dass die $Matches Hashtable nur das erste Vorkommen eines übereinstimmenden Musters enthält.

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

Aufzeichnungen werden in numerischen Integer--Schlüsseln gespeichert, die von links nach rechts zunehmen. Capture 1 enthält den gesamten Text bis zum Benutzernamen, und Capture 2 enthält nur den Benutzernamen.

$Matches
Name           Value
----           -----
2              CONTOSO\jsmith
1              The last logged on user was
0              The last logged on user was CONTOSO\jsmith

Wichtig

Der schlüssel 0 ist ein Integer. 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 Captures

Standardmäßig werden Aufzeichnungen in aufsteigender numerischer Reihenfolge von links nach rechts gespeichert. Sie können einer Capture-Gruppe auch einen Namen zuweisen. Dieser Name wird zu einem Schlüssel in der automatischen Variablen $MatchesHashtable.

Verwenden Sie in einer Aufzeichnungsgruppe ?<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 Windows-Sicherheitsprotokoll 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 den Namen 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

Mithilfe der regulären Ausdrücke (regex) mit dem Operator -replace 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 Regex-Ausdruck zur Ersetzung der in der Zeichenfolge gefundenen Übereinstimmungen.

Die Operanden <original> und <substitute> unterliegen den Regeln der Engine für reguläre Ausdrücke wie z. B. Zeichenmaskierung oder Ersetzung. Das Ersetzungsmuster kann zusammen mit Literalzeichen aus einer oder mehreren Ersetzungen bestehen.

Auf Erfassungsgruppen können in der <substitute>-String mithilfe des $-Zeichens vor dem Gruppenbezeichner verwiesen werden.

Es gibt zwei Möglichkeiten, Capture-Gruppen zu referenzieren: durch Nummer und durch Name.

  • Nach Nummer – Capture-Gruppen 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 – Capture-Gruppen können auch über den Namen referenziert werden.

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

Der Ausdruck $& steht für den gesamten übereinstimmenden Text.

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

Warnung

Da das Zeichen $ bei der Zeichenfolgeerweiterung verwendet wird, müssen Sie wörtliche Zeichenfolgen mit Ersetzung verwenden oder das Zeichen $ maskieren, 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 die $ als Literalzeichen verwenden möchten, verwenden Sie außerdem $$ anstelle der normalen Escapezeichen. Wenn Sie doppelte Anführungszeichen verwenden, vermeiden Sie dennoch alle Instanzen von $, 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.

Kommentare in regulären Ausdrücken

Reguläre Ausdrücke können sehr komplex und schwer zu lesen sein. Sie können Kommentare verwenden, um sie verständlicher zu machen. In regulären Ausdrücken sind zwei Arten von Kommentaren zulässig.

  • Inlinekommentar ((?#))
  • Kommentar am Ende der Zeile (#)

Weitere Informationen finden Sie unter Kommentare zu regulären Ausdrücken im Abschnitt about_Comments.

Siehe auch