Ricerca…


Sintassi

  • 'text' -match 'RegExPattern'
  • 'text' -replace 'RegExPattern', 'newvalue'
  • [regex] :: Corrispondenza ("testo", "modello") # Corrispondenza singola
  • [regex] :: Corrispondenze ("testo", "modello") # Corrispondenze multiple
  • [Regex] :: Sostituire ( "testo", "modello", "newValue")
  • [regex] :: Replace ("text", "pattern", {param ($ m)}) #MatchEvaluator
  • [regex] :: Escape ("input") #Escape caratteri speciali

Partita singola

È possibile determinare rapidamente se un testo include uno schema specifico utilizzando Regex. Esistono diversi modi per lavorare con Regex in PowerShell.

#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@

#Sample pattern: Content wrapped in ()
$pattern = '\(.*?\)'

Utilizzando l'operatore -Match

Per determinare se una stringa corrisponde a un modello usando l'operatore built-in -matches , utilizzare la sintassi 'input' -match 'pattern' . Ciò restituirà true o false seconda del risultato della ricerca. Se c'era una corrispondenza è possibile visualizzare la partita e i gruppi (se definiti nel modello) accedendo alla variabile $Matches .

> $text -match $pattern
True

> $Matches

Name Value
---- -----
0    (a)  

Puoi anche usare -match per filtrare attraverso una serie di stringhe e restituire solo le stringhe contenenti una corrispondenza.

> $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

Utilizzando Select-String

PowerShell 2.0 ha introdotto un nuovo cmdlet per la ricerca nel testo mediante espressioni regolari. Esso restituisce un MatchInfo struttura per textinput che contiene una corrispondenza. Puoi accedere alle sue proprietà per trovare gruppi corrispondenti ecc.

> $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)}

Come -match , Select-String può essere utilizzato anche per filtrare attraverso una serie di stringhe convogliando una matrice su di essa. Crea un oggetto MatchInfo per stringa che include una corrispondenza.

> $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 può anche cercare usando un normale pattern di testo (nessuna regex) aggiungendo l' -SimpleMatch .

Utilizzo di [RegEx] :: Match ()

È anche possibile utilizzare il metodo statico Match() disponibile nella classe [RegEx] .NET.

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

Sostituire

Un compito comune per regex è sostituire il testo che corrisponde a un modello con un nuovo valore.

#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@

#Sample pattern: Text wrapped in ()
$pattern = '\(.*?\)'

#Replace matches with:
$newvalue = 'test'

Utilizzando -Riposare l'operatore

L'operatore -replace in PowerShell può essere utilizzato per sostituire il testo che corrisponde a un modello con un nuovo valore utilizzando la sintassi 'input' -replace 'pattern', 'newvalue' .

> $text -replace $pattern, $newvalue
This is test sample
text, this is
a test

Utilizzo del metodo [RegEx]: Sostituisci ()

La sostituzione delle corrispondenze può essere eseguita anche utilizzando il metodo Replace() nella classe [RegEx] .NET.

[regex]::Replace($text, $pattern, 'test')
This is test sample
text, this is
a test

Sostituisci il testo con il valore dinamico usando un valore MatchEvalutor

A volte è necessario sostituire un valore corrispondente a un modello con un nuovo valore basato su quella specifica corrispondenza, rendendo impossibile la previsione del nuovo valore. Per questi tipi di scenari, un MatchEvaluator può essere molto utile.

In PowerShell, MatchEvaluator è semplice come un blocco di script con un singolo parametro che contiene un oggetto Match per la corrispondenza corrente. L'output dell'azione sarà il nuovo valore per quella specifica partita. MatchEvalutor può essere utilizzato con il metodo statico [Regex]::Replace() .

Esempio : sostituzione del testo dentro () con la sua lunghezza

#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

}

Produzione:

> [regex]::Replace($text, $pattern, $MatchEvalutor)

This is 1 sample
text, this is
a 11

Esempio: crea un sample maiuscolo

#Sample pattern: "Sample"
$pattern = 'sample'

$MatchEvalutor = {
    param($match)

    #Return match in upper-case
    $match.Value.ToUpper()

}

Produzione:

> [regex]::Replace($text, $pattern, $MatchEvalutor)

This is (a) SAMPLE
text, this is
a (SAMPLE text)

Sfuggire personaggi speciali

Un modello regex utilizza molti caratteri speciali per descrivere un modello. Es., . significa "qualsiasi carattere", + è "uno o più" ecc.

Per utilizzare questi caratteri, come a . , + ecc., in uno schema, è necessario sfuggire a loro per rimuovere il loro significato speciale. Questo viene fatto usando il carattere di escape che è un backslash \ in espressioni regolari. Esempio: per cercare + , dovresti usare il pattern \+ .

Può essere difficile ricordare tutti i caratteri speciali nella regex, quindi per sfuggire a tutti i caratteri speciali di una stringa che si desidera cercare, è possibile utilizzare il metodo [RegEx]::Escape("input") .

> [regex]::Escape("(foo)")
\(foo\)

> [regex]::Escape("1+1.2=2.2")
1\+1\.2=2\.2

Più partite

Esistono diversi modi per trovare tutte le corrispondenze per un modello in un testo.

#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@

#Sample pattern: Content wrapped in ()
$pattern = '\(.*?\)'

Utilizzando Select-String

È possibile trovare tutte le corrispondenze (corrispondenza globale) aggiungendo l' -AllMatches a 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)

Utilizzo di [RegEx] :: Matches ()

Il metodo Matches() nella classe .NET `[regex] può anche essere utilizzato per eseguire una ricerca globale per più corrispondenze.

> [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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow