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

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)


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow