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)
2.0

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)


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow