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)
2,0

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)


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow