Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Breve descrizione
Descrive le espressioni regolari in PowerShell.
Descrizione lunga
Nota
Questo articolo illustra la sintassi e i metodi per l'uso di espressioni regolari in PowerShell. Non copre tutte le espressioni possibili. Per informazioni di riferimento più complete, vedere Linguaggio di espressioni regolari - Riferimento rapido.
Un'espressione regolare è un criterio usato per trovare una corrispondenza con il testo. Può essere costituito da caratteri letterali, operatori e altri costrutti. PowerShell utilizza il motore regex .NET .
Questo articolo illustra la sintassi delle espressioni regolari in PowerShell. PowerShell include diversi operatori e cmdlet che usano espressioni regolari. Per altre informazioni sulla sintassi e sull'utilizzo, vedere i collegamenti seguenti.
- Select-String
- operatori -match e -replace
- -operatore split
- istruzione switch con opzione -regex
Le espressioni regolari di PowerShell non fanno distinzione tra maiuscole e minuscole per impostazione predefinita. Ogni metodo mostrato sopra ha un modo diverso per forzare la distinzione tra maiuscole e minuscole.
- Per
Select-String, utilizzare il parametro CaseSensitive. - Per gli operatori che usano espressioni regolari, usare la versione con distinzione tra maiuscole e minuscole:
-cmatch,-creplaceo-csplit - Per l'istruzione
switch, usare l'opzione-CaseSensitive
Valori letterali carattere
Un'espressione regolare può essere un carattere letterale o una stringa. L'espressione fa in modo che il motore corrisponda esattamente al testo specificato.
# This statement returns true because book contains the string "oo"
'book' -match 'oo'
Classi di caratteri
Mentre i letterali di caratteri funzionano se si conosce il modello esatto, le classi di caratteri consentono di essere meno specifici.
Gruppi di caratteri
[character group] consente di associare un numero qualsiasi di caratteri una volta, mentre [^character group] corrisponde solo ai caratteri NON nel gruppo.
# This expression returns true if the pattern matches big, bog, or bug.
'big' -match 'b[iou]g'
Se l'elenco di caratteri da associare include il carattere trattino (-), deve trovarsi all'inizio o alla fine dell'elenco per distinguerlo da un'espressione di intervallo di caratteri.
Intervalli di caratteri
Uno schema può anche essere un intervallo di caratteri. I caratteri possono essere alfabetici [A-Z], [0-9]numerici o persino [ -~] basati su ASCII (tutti i caratteri stampabili).
# This expression returns true if the pattern matches any 2 digit number.
42 -match '[0-9][0-9]'
Numeri
La \d classe di caratteri corrisponde a qualsiasi cifra decimale. Al contrario, \D corrisponde a qualsiasi carattere ad eccezione delle cifre decimali.
# This expression returns true if it matches a server name.
# (Server-01 - Server-99).
'Server-01' -match 'Server-\d\d'
Caratteri di parola
La classe di caratteri \w corrisponde a qualsiasi carattere di parola [a-zA-Z_0-9]. Per trovare la corrispondenza con qualsiasi carattere non alfanumerico, usare \W.
# This expression returns true.
# The pattern matches the first word character 'B'.
'Book' -match '\w'
Caratteri jolly
Il punto (.) è un carattere jolly nelle espressioni regolari. Corrisponde a qualsiasi carattere ad eccezione di una nuova riga (\n).
# This expression returns true.
# The pattern matches any 4 characters except the newline.
'a1\ ' -match '....'
Spazi vuoti
È possibile associare qualsiasi carattere di spazio vuoto alla classe di caratteri \s. È possibile associare qualsiasi carattere non vuoto a \S. È possibile associare i caratteri dello spazio letterale con .
# This expression returns true.
# The pattern uses the whitespace character class to match the leading
# space and a literal space to matching the trailing space.
' - ' -match '\s- '
Quantificatori
I quantificatori controllano il numero di istanze di ogni elemento che devono essere presenti nella stringa di input.
Di seguito sono riportati alcuni quantificatori disponibili in PowerShell:
| Quantificatore | Descrizione |
|---|---|
* |
Zero o più volte. |
+ |
Una o più volte. |
? |
Zero o una volta. |
{n,m} |
Almeno n, ma non più di m volte. |
L'asterisco (*) corrisponde all'elemento precedente zero o più volte. Il risultato è che anche una stringa di input senza l'elemento presente verrebbe considerata una corrispondenza.
# This returns true for all account name strings even if the name is absent.
'ACCOUNT NAME: Administrator' -match 'ACCOUNT NAME:\s*\w*'
Il segno più (+) corrisponde all'elemento precedente una o più volte.
# This returns true if it matches any server name.
'DC-01' -match '[A-Z]+-\d\d'
Il punto interrogativo ? corrisponde all'elemento precedente zero o una volta. Come l'asterisco *, corrisponde anche alle stringhe in cui l'elemento è assente.
# This returns true for any server name, even server names without dashes.
'SERVER01' -match '[A-Z]+-?\d\d'
Il quantificatore {n, m} può essere usato in diversi modi per consentire un controllo granulare sul quantificatore. Il secondo elemento m e la virgola , sono facoltativi.
| Quantificatore | Descrizione |
|---|---|
{n} |
Trova la corrispondenza ESATTAMENTE n numero di volte. |
{n,} |
Abbina almeno n volte. |
{n,m} |
Trova la corrispondenza tra n e m numero di volte. |
# This returns true if it matches any phone number.
'111-222-3333' -match '\d{3}-\d{3}-\d{4}'
Ancoraggi
Gli ancoraggi consentono di determinare se una corrispondenza avrà esito positivo o negativo in base alla loro posizione nella stringa di input.
I due ancoraggi comunemente usati sono ^ e $. Il cursore ^ corrisponde all'inizio di una stringa e $, che corrisponde alla fine di una stringa. Gli ancoraggi consentono di far corrispondere il testo in una posizione specifica, scartando anche i caratteri indesiderati.
# The pattern expects the string 'fish' to be the only thing on the line.
# This returns FALSE.
'fishing' -match '^fish$'
Nota
Quando si definisce un'espressione regolare contenente un ancoraggio ($ ), è necessario racchiudere l'espressione regolare tra virgolette singole ('). Se si usano virgolette doppie ("), PowerShell interpreta la stringa come espressione di variabile espandibile.
Quando si usano ancoraggi in PowerShell, è necessario comprendere la differenza tra le opzioni di espressioni regolari Singola linea e Multilinea.
-
Multilinea: la modalità multilinea forza
^e$a corrispondere all'inizio e alla fine di ogni riga anziché all'inizio e alla fine della stringa di input. -
Singleline: la modalità SingleLine considera la stringa di input come SingleLine.
Forza il carattere
.a corrispondere a ogni carattere (comprese le nuove righe), invece di corrispondere a ogni carattere tranne la nuova riga\n.
Per maggiori informazioni su queste opzioni e su come usarle, visitare la pagina su Linguaggio di espressioni regolari - Riferimento rapido.
Caratteri di escape
Il backslash (\) viene usato per evitare l'interpretazione dei caratteri, affinché non vengano analizzati dal motore delle espressioni regolari.
I caratteri seguenti sono riservati: [().\^$|?*+{.
Dovrai eseguire l'escape di questi caratteri nei tuoi modelli per farli corrispondere alle stringhe di input.
# This returns true and matches numbers with at least 2 digits of precision.
# The decimal point is escaped using the backslash.
'3.141' -match '3\.\d{2,}'
Esiste un metodo statico della classe regex che può eseguire l'escape del testo per te.
[regex]::Escape('3.\d{2,}')
3\.\\d\{2,}
Nota
In questo modo vengono 'escapati' tutti i caratteri riservati di espressioni regolari, incluse le barre rovesciate esistenti usate nelle classi di caratteri. Assicurarsi di usarlo solo nella parte del modello in cui devi eseguire l'escape.
Altri caratteri di escape
Sono inoltre disponibili caratteri di escape riservati che è possibile usare per trovare corrispondenze con tipi di caratteri speciali.
Di seguito sono riportati alcuni caratteri di escape di uso comune:
| Sequenza di escape | Descrizione |
|---|---|
\t |
Corrisponde a un tab |
\n |
Corrisponde a una nuova riga |
\r |
Corrisponde a un ritorno a capo |
Gruppi, acquisizioni e sostituzioni
I costrutti di raggruppamento separano una stringa di input in sottostringhe che possono essere acquisite o ignorate. Le sottostringhe raggruppate sono denominate sottoespressioni. Per impostazione predefinita, le sottoespressioni vengono acquisite in gruppi numerati, anche se è possibile assegnare nomi anche a tali sottoespressioni.
Un costrutto di raggruppamento è un'espressione regolare racchiusa tra parentesi. Qualsiasi testo corrispondente all'espressione regolare racchiusa viene catturato. Nell'esempio seguente il testo di input viene suddiviso in due gruppi di acquisizione.
'The last logged on user was CONTOSO\jsmith' -match '(.+was )(.+)'
True
Usare la $MatchesHashtable variabile automatica per recuperare il testo acquisito.
Il testo che rappresenta l'intera corrispondenza viene archiviato nella chiave 0. È importante notare che la tabella hash $Matches contiene solo la prima occorrenza di qualsiasi motivo corrispondente.
$Matches.0
The last logged on user was CONTOSO\jsmith
Le catture vengono archiviate in chiavi numeriche intere che aumentano da sinistra a destra. Capture 1 contiene tutto il testo fino al nome utente, mentre capture 2 contiene solo il nome utente.
$Matches
Name Value
---- -----
2 CONTOSO\jsmith
1 The last logged on user was
0 The last logged on user was CONTOSO\jsmith
Importante
La chiave 0 è un Integer. È possibile usare qualsiasi metodo hashtable per accedere al valore archiviato.
PS> 'Good Dog' -match 'Dog'
True
PS> $Matches[0]
Dog
PS> $Matches.Item(0)
Dog
PS> $Matches.0
Dog
Acquisizioni denominate
Per impostazione predefinita, le acquisizioni vengono archiviate in ordine numerico crescente, da sinistra a destra.
È possibile assegnare anche un nome a un gruppo di cattura. Questo nome diventa una chiave nella variabile automatica della tabella hash $Matches.
All'interno di un gruppo di acquisizione, usare ?<keyname> per archiviare i dati acquisiti in una chiave denominata.
PS> $string = 'The last logged on user was CONTOSO\jsmith'
PS> $string -match 'was (?<domain>.+)\\(?<user>.+)'
True
PS> $Matches
Name Value
---- -----
domain CONTOSO
user jsmith
0 was CONTOSO\jsmith
PS> $Matches.domain
CONTOSO
PS> $Matches.user
jsmith
Nell'esempio seguente viene archiviata la voce di log più recente nel registro di sicurezza di Windows. L'espressione regolare fornita estrae il nome utente e il dominio dal messaggio e li archivia nelle chiavi:N per nome e D per il dominio.
$log = (Get-WinEvent -LogName Security -MaxEvents 1).Message
$r = '(?s).*Account Name:\s*(?<N>.*).*Account Domain:\s*(?<D>[A-Z,0-9]*)'
$log -match $r
True
$Matches
Name Value
---- -----
D CONTOSO
N jsmith
0 A process has exited...
Per altre informazioni, vedere Costrutti di raggruppamento nelle espressioni regolari.
Sostituzioni nelle espressioni regolari
L'uso delle espressioni regolari (regex) con l'operatore -replace consente di sostituire in modo dinamico il testo usando il testo acquisito.
<input> -replace <original>, <substitute>
-
<input>: stringa da cercare -
<original>: espressione regolare usata per cercare la stringa di input -
<substitute>: espressione di sostituzione regex per sostituire le corrispondenze trovate nella stringa di input.
Gli operandi <original> e <substitute> sono soggetti a regole del motore delle espressioni regolari, ad esempio l'escape dei caratteri o le espressioni di sostituzione. Il modello di sostituzione può essere costituito da una o più sostituzioni insieme ai caratteri letterali.
È possibile fare riferimento ai gruppi di acquisizione nella stringa <substitute> usando il carattere $ prima dell'identificatore di gruppo.
Due modi per fare riferimento ai gruppi di acquisizione sono numero e Nome.
Per numero: i gruppi di acquisizione vengono numerati da sinistra a destra.
'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$1.$2.$3@contoso.com'John.D.Smith@contoso.comPer Nome - È anche possibile fare riferimento ai gruppi di acquisizione in base al nome.
'CONTOSO\Administrator' -replace '\w+\\(?<user>\w+)', 'FABRIKAM\${user}'FABRIKAM\Administrator
L'espressione $& rappresenta tutto il testo corrispondente.
'Gobble' -replace 'Gobble', '$& $&'
Gobble Gobble
Avvertimento
Poiché il carattere $ viene usato nell'espansione di stringhe, è necessario usare stringhe letterali con sostituzione oppure eseguire l'escape del carattere $ quando si usano virgolette doppie.
'Hello World' -replace '(\w+) \w+', '$1 Universe'
"Hello World" -replace "(\w+) \w+", "`$1 Universe"
Hello Universe
Hello Universe
Inoltre, se si desidera avere il $ come carattere letterale, usare $$ anziché i caratteri di escape normali. Quando si usano virgolette doppie, eseguire comunque l'escape di tutte le istanze di $ per evitare la sostituzione errata.
'5.72' -replace '(.+)', '$$$1'
"5.72" -replace "(.+)", "`$`$`$1"
$5.72
$5.72
Per informazioni dettagliate sulle espressioni di sostituzione, vedere Sostituzioni nelle espressioni regolari.
Commenti nelle espressioni regolari
Le espressioni regolari possono essere molto complesse e difficili da leggere. È possibile usare i commenti per renderli più comprensibili. Esistono due tipi di commenti consentiti nelle espressioni regolari.
- Commento in linea (
(?#)) - Commento di fine riga (
#)
Per altre informazioni, vedere la sezione commenti delle espressioni regolari di about_Comments.