PowerShell
Reguläre Ausdrücke
Suche…
Syntax
- 'Text' - Übereinstimmung mit 'RegExPattern'
- 'text' -replace 'RegExPattern', 'newvalue'
- [Regex] :: Match ("Text", "Muster") #Einzeln
- [Regex] :: Übereinstimmungen ("Text", "Muster") #Multiple Übereinstimmungen
- [Regex] :: Ersetzen ("Text", "Muster", "Neuer Wert")
- [Regex] :: Ersetzen ("Text", "Muster", {Param ($ m)}) #MatchEvaluator
- [Regex] :: Escape ("Eingabe") #Escape-Sonderzeichen
Einziges Paar
Mit Regex können Sie schnell feststellen, ob ein Text ein bestimmtes Muster enthält. Es gibt mehrere Möglichkeiten, mit Regex in PowerShell zu arbeiten.
#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@
#Sample pattern: Content wrapped in ()
$pattern = '\(.*?\)'
Verwenden des -Match-Operators
Verwenden Sie die Syntax 'input' -match 'pattern'
, um festzustellen, ob eine Zeichenfolge mit dem integrierten -matches
Operator 'input' -match 'pattern'
. Dies gibt je nach Ergebnis der Suche " true
oder " false
. Wenn Übereinstimmung vorhanden ist, können Sie die Übereinstimmung und die Gruppen (sofern in Muster definiert) anzeigen, indem Sie auf die Variable $Matches
zugreifen.
> $text -match $pattern
True
> $Matches
Name Value
---- -----
0 (a)
Sie können auch -match
, um durch ein Array von Strings zu filtern und nur die Strings zurückzugeben, die eine Übereinstimmung enthalten.
> $textarray = @"
This is (a) sample
text, this is
a (sample text)
"@ -split "`n"
> $textarray -match $pattern
This is (a) sample
a (sample text)
Select-String verwenden
In PowerShell 2.0 wurde ein neues Cmdlet für das Durchsuchen von Text mit Regex eingeführt. Es gibt ein MatchInfo
Objekt pro Texteingabe zurück, die eine Übereinstimmung enthält. Sie können auf seine Eigenschaften zugreifen, um übereinstimmende Gruppen usw. zu finden.
> $m = Select-String -InputObject $text -Pattern $pattern
> $m
This is (a) sample
text, this is
a (sample text)
> $m | Format-List *
IgnoreCase : True
LineNumber : 1
Line : This is (a) sample
text, this is
a (sample text)
Filename : InputStream
Path : InputStream
Pattern : \(.*?\)
Context :
Matches : {(a)}
Genau wie -match
kann Select-String
auch verwendet werden, um ein Array von Strings zu filtern, indem ein Array an dieses übergeben wird. Es erstellt ein MatchInfo
-Objekt pro Zeichenfolge, das eine Übereinstimmung enthält.
> $textarray | Select-String -Pattern $pattern
This is (a) sample
a (sample text)
#You can also access the matches, groups etc.
> $textarray | Select-String -Pattern $pattern | fl *
IgnoreCase : True
LineNumber : 1
Line : This is (a) sample
Filename : InputStream
Path : InputStream
Pattern : \(.*?\)
Context :
Matches : {(a)}
IgnoreCase : True
LineNumber : 3
Line : a (sample text)
Filename : InputStream
Path : InputStream
Pattern : \(.*?\)
Context :
Matches : {(sample text)}
Select-String
kann auch mit einem normalen Textmuster (ohne -SimpleMatch
) -SimpleMatch
, indem Sie den Schalter -SimpleMatch
hinzufügen.
Verwendung von [RegEx] :: Match ()
Sie können auch die statische Match()
-Methode verwenden, die in der .NET [RegEx]
-Klasse verfügbar ist.
> [regex]::Match($text,$pattern)
Groups : {(a)}
Success : True
Captures : {(a)}
Index : 8
Length : 3
Value : (a)
> [regex]::Match($text,$pattern) | Select-Object -ExpandProperty Value
(a)
Ersetzen
Eine übliche Aufgabe für Regex ist das Ersetzen von Text, der einem Muster entspricht, durch einen neuen Wert.
#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@
#Sample pattern: Text wrapped in ()
$pattern = '\(.*?\)'
#Replace matches with:
$newvalue = 'test'
Verwenden Sie -Replace Operator
Der -replace
Operator in PowerShell kann verwendet werden, um Text, der einem Muster entspricht, durch einen neuen Wert zu ersetzen. Verwenden Sie dazu die Syntax 'input' -replace 'pattern', 'newvalue'
.
> $text -replace $pattern, $newvalue
This is test sample
text, this is
a test
Verwendung der Methode [RegEx] :: Replace ()
Das Ersetzen von Übereinstimmungen kann auch mit der Replace()
Methode in der .NET-Klasse [RegEx]
.
[regex]::Replace($text, $pattern, 'test')
This is test sample
text, this is
a test
Ersetzen Sie Text durch einen dynamischen Wert mit einem MatchEvalutor
In manchen Fällen müssen Sie einen Wert, der einem Muster entspricht, durch einen neuen Wert ersetzen, der auf diesem bestimmten Treffer basiert, sodass der neue Wert nicht vorhergesagt werden kann. Für diese Arten von Szenarien kann ein MatchEvaluator
sehr nützlich sein.
In PowerShell ist ein MatchEvaluator
so einfach wie ein Skriptblock mit einem einzigen Parameter, der ein Match
Objekt für das aktuelle Match enthält. Die Ausgabe der Aktion ist der neue Wert für diese bestimmte Übereinstimmung. MatchEvalutor
kann mit der statischen Methode [Regex]::Replace()
verwendet werden.
Beispiel : Ersetzen des Textes inside ()
durch seine Länge
#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@
#Sample pattern: Content wrapped in ()
$pattern = '(?<=\().*?(?=\))'
$MatchEvalutor = {
param($match)
#Replace content with length of content
$match.Value.Length
}
Ausgabe:
> [regex]::Replace($text, $pattern, $MatchEvalutor)
This is 1 sample
text, this is
a 11
Beispiel: Machen Sie ein sample
Großbuchstaben
#Sample pattern: "Sample"
$pattern = 'sample'
$MatchEvalutor = {
param($match)
#Return match in upper-case
$match.Value.ToUpper()
}
Ausgabe:
> [regex]::Replace($text, $pattern, $MatchEvalutor)
This is (a) SAMPLE
text, this is
a (SAMPLE text)
Sonderzeichen entkommen
Ein Regex-Muster verwendet viele Sonderzeichen, um ein Muster zu beschreiben. Ex., .
bedeutet "beliebiges Zeichen", +
ist "ein oder mehrere" usw.
Um diese Zeichen zu verwenden, als .
, +
usw. in einem Muster müssen Sie sie entziehen, um ihre spezielle Bedeutung zu entfernen. Dazu verwenden Sie das Escape-Zeichen, das in regex ein Backslash \
. Beispiel: Um nach +
zu suchen, verwenden Sie das Muster \+
.
Es kann schwierig sein, sich alle Sonderzeichen in Regex zu merken. Um jedes Sonderzeichen in einer Zeichenfolge zu speichern, nach der Sie suchen möchten, können Sie die Methode [RegEx]::Escape("input")
verwenden.
> [regex]::Escape("(foo)")
\(foo\)
> [regex]::Escape("1+1.2=2.2")
1\+1\.2=2\.2
Mehrere Übereinstimmungen
Es gibt mehrere Möglichkeiten, alle Übereinstimmungen für ein Muster in einem Text zu finden.
#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@
#Sample pattern: Content wrapped in ()
$pattern = '\(.*?\)'
Select-String verwenden
Sie können alle Übereinstimmungen (globale Übereinstimmung) finden, indem Sie den Schalter -AllMatches
zu Select-String
hinzufügen.
> $m = Select-String -InputObject $text -Pattern $pattern -AllMatches
> $m | Format-List *
IgnoreCase : True
LineNumber : 1
Line : This is (a) sample
text, this is
a (sample text)
Filename : InputStream
Path : InputStream
Pattern : \(.*?\)
Context :
Matches : {(a), (sample text)}
#List all matches
> $m.Matches
Groups : {(a)}
Success : True
Captures : {(a)}
Index : 8
Length : 3
Value : (a)
Groups : {(sample text)}
Success : True
Captures : {(sample text)}
Index : 37
Length : 13
Value : (sample text)
#Get matched text
> $m.Matches | Select-Object -ExpandProperty Value
(a)
(sample text)
Verwendung von [RegEx] :: Matches ()
Die Matches()
Methode in der .NET-Klasse [regex] kann auch verwendet werden, um eine globale Suche nach mehreren Übereinstimmungen durchzuführen.
> [regex]::Matches($text,$pattern)
Groups : {(a)}
Success : True
Captures : {(a)}
Index : 8
Length : 3
Value : (a)
Groups : {(sample text)}
Success : True
Captures : {(sample text)}
Index : 37
Length : 13
Value : (sample text)
> [regex]::Matches($text,$pattern) | Select-Object -ExpandProperty Value
(a)
(sample text)