PowerShell
Vanliga uttryck
Sök…
Syntax
- "text" -match "RegExPattern"
- 'text' -replace 'RegExPattern', 'newvalue'
- [regex] :: Match ("text", "mönster") # Enkel matchning
- [regex] :: Matchningar ("text", "mönster") # Flera matchningar
- [Regex] :: Ersätt ( "a", "mönster", "newValue")
- [regex] :: Ersätt ("text", "mönster", {param ($ m)}) #MatchEvaluator
- [regex] :: Escape ("input") #Specialtecken för landskap
Enkel match
Du kan snabbt bestämma om en text innehåller ett specifikt mönster med Regex. Det finns flera sätt att arbeta med Regex i PowerShell.
#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@
#Sample pattern: Content wrapped in ()
$pattern = '\(.*?\)'
Använda -Match-operatören
För att bestämma om en sträng matchar ett mönster med den inbyggda -matches
operatören använder du syntaxen 'input' -match 'pattern'
. Detta kommer att returnera true
eller false
beroende på resultatet av sökningen. Om det fanns matchning kan du se matchen och grupperna (om de definieras i mönster) genom att öppna $Matches
-variabel.
> $text -match $pattern
True
> $Matches
Name Value
---- -----
0 (a)
Du kan också använda -match
att filtrera genom en rad strängar och bara returnera strängarna som innehåller en matchning.
> $textarray = @"
This is (a) sample
text, this is
a (sample text)
"@ -split "`n"
> $textarray -match $pattern
This is (a) sample
a (sample text)
Använda Select-String
PowerShell 2.0 introducerade en ny cmdlet för att söka igenom text med regex. Det returnerar ett MatchInfo
objekt per textinmatning som innehåller en matchning. Du kan komma åt dess egenskaper för att hitta matchande grupper etc.
> $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)}
Som -match
kan Select-String
också användas för att filtrera genom en rad strängar genom att leda en matris till den. Det skapar ett MatchInfo
-objekt per sträng som innehåller en matchning.
> $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 också söka med ett normalt textmönster (ingen regex) genom att lägga till -SimpleMatch
omkopplaren.
Använda [RegEx] :: Match ()
Du kan också använda den statiska Match()
metoden som är tillgänglig i .NET [RegEx]
-klass.
> [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)
Byta ut
En vanlig uppgift för regex är att ersätta text som matchar ett mönster med ett nytt värde.
#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@
#Sample pattern: Text wrapped in ()
$pattern = '\(.*?\)'
#Replace matches with:
$newvalue = 'test'
Använda -Byt ut operatören
Operatören -replace
i PowerShell kan användas för att ersätta text som matchar ett mönster med ett nytt värde med syntaxen 'input' -replace 'pattern', 'newvalue'
.
> $text -replace $pattern, $newvalue
This is test sample
text, this is
a test
Använda [RegEx] :: Ersätt () metod
Byte av matchningar kan också göras med metoden Replace()
i klassen [RegEx]
.NET.
[regex]::Replace($text, $pattern, 'test')
This is test sample
text, this is
a test
Byt ut text med dynamiskt värde med en MatchEvalutor
Ibland måste du byta ut ett värde som matchar ett mönster med ett nytt värde som är baserat på den specifika matchningen, vilket gör det omöjligt att förutsäga det nya värdet. För dessa typer av scenarier kan en MatchEvaluator
vara mycket användbar.
I PowerShell är en MatchEvaluator
lika enkel som en skriptblock med en enda paramter som innehåller ett Match
objekt för den aktuella matchen. Åtgärdens utgång blir det nya värdet för den specifika matchningen. MatchEvalutor
kan användas med den statiska metoden [Regex]::Replace()
.
Exempel : Byta ut texten inuti ()
med dess längd
#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
}
Produktion:
> [regex]::Replace($text, $pattern, $MatchEvalutor)
This is 1 sample
text, this is
a 11
Exempel: Gör sample
stora bokstäver
#Sample pattern: "Sample"
$pattern = 'sample'
$MatchEvalutor = {
param($match)
#Return match in upper-case
$match.Value.ToUpper()
}
Produktion:
> [regex]::Replace($text, $pattern, $MatchEvalutor)
This is (a) SAMPLE
text, this is
a (SAMPLE text)
Undvika specialtecken
Ett regex-mönster använder många specialtecken för att beskriva ett mönster. Ex., .
betyder "valfri karaktär", +
är "en eller flera" etc.
För att använda dessa tecken, som en .
, +
etc., i ett mönster, måste du fly dem för att ta bort deras speciella betydelse. Detta görs genom att använda escape-karaktären som är ett backslash \
i regex. Exempel: För att söka efter +
använder du mönstret \+
.
Det kan vara svårt att komma ihåg alla specialtecken i regex, så för att undkomma alla specialtecken i en sträng du vill söka kan du använda [RegEx]::Escape("input")
.
> [regex]::Escape("(foo)")
\(foo\)
> [regex]::Escape("1+1.2=2.2")
1\+1\.2=2\.2
Flera matcher
Det finns flera sätt att hitta alla matchningar för ett mönster i en text.
#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@
#Sample pattern: Content wrapped in ()
$pattern = '\(.*?\)'
Använda Select-String
Du kan hitta alla matchningar (global matchning) genom att lägga till -AllMatches
omkopplaren till 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)
Använda [RegEx] :: Matchningar ()
Metoden Matches()
i .NET `[regex] -klassen kan också användas för att göra en global sökning efter flera matchningar.
> [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)