PowerShell
Espressioni regolari
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)
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)