PowerShell
Normale uitdrukkingen
Zoeken…
Syntaxis
- 'text' -match 'RegExPattern'
- 'text' - vervang 'RegExPattern', 'newvalue'
- [regex] :: Match ("text", "pattern") #Eenvoudige overeenkomst
- [regex] :: Overeenkomsten ("tekst", "patroon") # Meerdere overeenkomsten
- [Regex] :: vervangen ( "tekst", "patroon", "newValue")
- [regex] :: Replace ("text", "pattern", {param ($ m)}) #MatchEvaluator
- [regex] :: Escape ("input") #Escape speciale karakters
Enkele wedstrijd
U kunt snel bepalen of een tekst een specifiek patroon bevat met Regex. Er zijn meerdere manieren om met Regex in PowerShell te werken.
#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@
#Sample pattern: Content wrapped in ()
$pattern = '\(.*?\)'
De operator -Match gebruiken
Te bepalen of een tekenreeks overeenkomt met een patroon met de ingebouwde -matches
operator gebruikt de syntaxis 'input' -match 'pattern'
. Dit geeft true
of false
afhankelijk van het resultaat van de zoekopdracht. Als er een overeenkomst was, kunt u de overeenkomst en groepen bekijken (indien gedefinieerd in patroon) door toegang te krijgen tot de $Matches
-variabele.
> $text -match $pattern
True
> $Matches
Name Value
---- -----
0 (a)
U kunt ook -match
om door een reeks tekenreeksen te filteren en alleen de tekenreeksen met een overeenkomst retourneren.
> $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 gebruiken
PowerShell 2.0 heeft een nieuwe cmdlet geïntroduceerd voor het doorzoeken van tekst met behulp van regex. Het retourneert een MatchInfo
object per tekstinvoer dat een overeenkomst bevat. Je hebt toegang tot de eigenschappen om overeenkomende groepen, enz. Te vinden.
> $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)}
Net als -match
kan Select-String
ook worden gebruikt om door een reeks strings te filteren door er een array naar toe te leiden. Het maakt een MatchInfo
-object per string met een match.
> $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
kan ook zoeken met een normaal tekstpatroon (geen regex) door de schakelaar -SimpleMatch
toe te voegen.
[RegEx] :: Match () gebruiken
U kunt ook de statische Match()
-methode gebruiken die beschikbaar is in de .NET [RegEx]
-klasse.
> [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)
Vervangen
Een veel voorkomende taak voor regex is het vervangen van tekst die overeenkomt met een patroon met een nieuwe waarde.
#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@
#Sample pattern: Text wrapped in ()
$pattern = '\(.*?\)'
#Replace matches with:
$newvalue = 'test'
Gebruik -vervanger
De -replace
operator in PowerShell kan worden gebruikt om tekst overeenkomen met een patroon met een nieuwe waarde met de syntaxis vervangen 'input' -replace 'pattern', 'newvalue'
.
> $text -replace $pattern, $newvalue
This is test sample
text, this is
a test
Met behulp van de methode [RegEx] :: Replace ()
Het vervangen van overeenkomsten kan ook worden gedaan met behulp van de methode Replace()
in de klasse [RegEx]
.NET.
[regex]::Replace($text, $pattern, 'test')
This is test sample
text, this is
a test
Vervang tekst door dynamische waarde met behulp van een MatchEvalutor
Soms moet u een waarde die overeenkomt met een patroon vervangen door een nieuwe waarde die is gebaseerd op die specifieke overeenkomst, waardoor het onmogelijk is om de nieuwe waarde te voorspellen. Voor dit soort scenario's kan een MatchEvaluator
erg handig zijn.
In PowerShell is een MatchEvaluator
zo eenvoudig als een scriptblok met een enkele parameter die een Match
-object voor de huidige match bevat. De uitvoer van de actie is de nieuwe waarde voor die specifieke wedstrijd. MatchEvalutor
kan worden gebruikt met de statische methode [Regex]::Replace()
.
Voorbeeld : de tekst binnen ()
door de lengte
#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
}
Output:
> [regex]::Replace($text, $pattern, $MatchEvalutor)
This is 1 sample
text, this is
a 11
Voorbeeld: maak een sample
hoofdletters
#Sample pattern: "Sample"
$pattern = 'sample'
$MatchEvalutor = {
param($match)
#Return match in upper-case
$match.Value.ToUpper()
}
Output:
> [regex]::Replace($text, $pattern, $MatchEvalutor)
This is (a) SAMPLE
text, this is
a (SAMPLE text)
Ontsnap aan speciale karakters
Een regex-patroon gebruikt veel speciale tekens om een patroon te beschrijven. Ex., .
betekent "elk teken", +
is "een of meer" enz.
Om deze tekens te gebruiken, als een .
, +
etc., in een patroon, moet je ze ontsnappen om hun speciale betekenis te verwijderen. Dit wordt gedaan met behulp van het escape-teken, dat een backslash \
in regex is. Voorbeeld: om naar +
te zoeken, gebruikt u het patroon \+
.
Het kan moeilijk zijn om alle speciale tekens in regex te onthouden, dus om te ontsnappen aan elk speciaal teken in een string waarnaar u wilt zoeken, kunt u de methode [RegEx]::Escape("input")
gebruiken.
> [regex]::Escape("(foo)")
\(foo\)
> [regex]::Escape("1+1.2=2.2")
1\+1\.2=2\.2
Meerdere wedstrijden
Er zijn meerdere manieren om alle overeenkomsten voor een patroon in een tekst te vinden.
#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@
#Sample pattern: Content wrapped in ()
$pattern = '\(.*?\)'
Select-String gebruiken
U kunt alle overeenkomsten (globale overeenkomst) vinden door de schakelaar -AllMatches
toe te voegen aan Select-String
.
> $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)
Gebruik van [RegEx] :: Wedstrijden ()
De methode Matches()
in de .NET `[regex] -klasse kan ook worden gebruikt om wereldwijd naar meerdere overeenkomsten te zoeken.
> [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)