about_Regular_Expressions
Kort beskrivning
Beskriver reguljära uttryck i PowerShell.
Lång beskrivning
Kommentar
Den här artikeln visar syntaxen och metoderna för att använda reguljära uttryck i PowerShell. Den omfattar inte alla möjliga uttryck. En mer fullständig referens finns i Språk för reguljärt uttryck – snabbreferens.
Ett reguljärt uttryck är ett mönster som används för att matcha text. Den kan bestå av literaltecken, operatorer och andra konstruktioner.
Den här artikeln visar syntax för reguljära uttryck i PowerShell. PowerShell har flera operatorer och cmdletar som använder reguljära uttryck. Du kan läsa mer om deras syntax och användning på länkarna nedan.
- Välj sträng
- -match- och -replace-operatorer
- -split operator
- switch-instruktion med alternativet -regex
Vanliga PowerShell-uttryck är skiftlägeskänsliga som standard. Varje metod som visas ovan har ett annat sätt att framtvinga skiftlägeskänslighet.
- För
Select-String
använder du parametern CaseSensitive . - För operatorer som använder reguljära uttryck använder du den skiftlägeskänsliga versionen:
-cmatch
,-creplace
, eller-csplit
- För -instruktionen
switch
använder du alternativet-casesensitive
Teckenliteraler
Ett reguljärt uttryck kan vara ett literaltecken eller en sträng. Uttrycket gör att motorn matchar den angivna texten exakt.
# This statement returns true because book contains the string "oo"
'book' -match 'oo'
Teckenklasser
Medan teckenliteraler fungerar om du känner till det exakta mönstret kan du med teckenklasser vara mindre specifika.
Teckengrupper
[character group]
gör att du kan matcha valfritt antal tecken en gång, medan [^character group]
endast matchar tecken INTE i gruppen.
# This expression returns true if the pattern matches big, bog, or bug.
'big' -match 'b[iou]g'
Om listan med tecken som ska matcha innehåller bindestreckstecknet (-
), måste det vara i början eller slutet av listan för att skilja det från ett teckenintervalluttryck.
Teckenintervall
Ett mönster kan också vara ett teckenintervall. Tecknen kan vara alfabetiska [A-Z]
, numeriska [0-9]
eller till och med ASCII-baserade [ -~]
(alla utskrivbara tecken).
# This expression returns true if the pattern matches any 2 digit number.
42 -match '[0-9][0-9]'
Nummer
Teckenklassen \d
matchar alla decimaler. Omvänt \D
matchar alla icke-decimala siffror.
# This expression returns true if it matches a server name.
# (Server-01 - Server-99).
'Server-01' -match 'Server-\d\d'
Word-tecken
Teckenklassen \w
matchar alla ordtecken [a-zA-Z_0-9]
. Om du vill matcha tecken som inte är ord använder du \W
.
# This expression returns true.
# The pattern matches the first word character 'B'.
'Book' -match '\w'
Jokertecken
Perioden (.
) är ett jokertecken i reguljära uttryck. Det matchar alla tecken förutom en ny rad (\n
).
# This expression returns true.
# The pattern matches any 4 characters except the newline.
'a1\ ' -match '....'
Tomt utrymme
Du kan matcha alla blankstegstecken med teckenklassen \s
. Du kan matcha alla tecken som inte är blanksteg med \S
. Du kan matcha blankstegstecken med
.
# 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- '
Kvantifierare
Kvantifierare styr hur många instanser av varje element som ska finnas i indatasträngen.
Följande är några av de kvantifierare som är tillgängliga i PowerShell:
Kvantifierare | beskrivning |
---|---|
* |
Noll eller fler gånger. |
+ |
En eller flera gånger. |
? |
Noll eller en gång. |
{n,m} |
Åtminstone n , men inte mer än m gånger. |
Asterisken (*
) matchar föregående element noll eller fler gånger. Resultatet är att även en indatasträng utan elementet skulle vara en matchning.
# This returns true for all account name strings even if the name is absent.
'ACCOUNT NAME: Administrator' -match 'ACCOUNT NAME:\s*\w*'
Plustecknet (+
) matchar föregående element en eller flera gånger.
# This returns true if it matches any server name.
'DC-01' -match '[A-Z]+-\d\d'
Frågetecknet ?
matchar det tidigare elementet noll eller en gång. Precis som asterisk *
matchar den även strängar där elementet saknas.
# This returns true for any server name, even server names without dashes.
'SERVER01' -match '[A-Z]+-?\d\d'
Kvantifieraren {n, m}
kan användas på flera olika sätt för att tillåta detaljerad kontroll över kvantifieraren. Det andra elementet m
och kommatecknet ,
är valfria.
Kvantifierare | beskrivning |
---|---|
{n} |
Matcha EXAKT n antal gånger. |
{n,} |
Matcha minst n antal gånger. |
{n,m} |
Matcha mellan n och m antal gånger. |
# This returns true if it matches any phone number.
'111-222-3333' -match '\d{3}-\d{3}-\d{4}'
Fästpunkter
Med fästpunkter kan du orsaka att en matchning lyckas eller misslyckas baserat på matchningspositionen i indatasträngen.
De två vanliga fästpunkterna är ^
och $
. Caret ^
matchar början av en sträng och $
, som matchar slutet av en sträng. Med fästpunkterna kan du matcha texten vid en viss position samtidigt som du tar bort oönskade tecken.
# The pattern expects the string 'fish' to be the only thing on the line.
# This returns FALSE.
'fishing' -match '^fish$'
Kommentar
När du definierar en regex som innehåller en fästpunkt ($
) bör du omsluta regexen med enkla citattecken ('
). Om du använder dubbla citattecken ("
) tolkar PowerShell strängen som ett utökningsbart variabeluttryck.
När du använder fästpunkter i PowerShell bör du förstå skillnaden mellan alternativ för reguljära uttryck med en rad och flera linjer.
- Flera rader: Flerradsläget tvingar
^
och$
matchar början av varje RAD i stället för början och slutet av indatasträngen. - Enkelrad: Enkelradsläge behandlar indatasträngen som en enskild rad.
Det tvingar
.
tecknet att matcha varje tecken (inklusive nya streck), i stället för att matcha varje tecken UTOM den nya rad\n
.
Mer information om de här alternativen och hur du använder dem finns i Språk för reguljära uttryck – snabbreferens.
Ta ifrån tecken
Omvänt snedstreck (\
) används för att undkomma tecken så att de inte parsas av motorn för reguljära uttryck.
Följande tecken är reserverade: []().\^$|?*+{}
.
Du måste undvika dessa tecken i dina mönster för att matcha dem i dina indatasträngar.
# 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,}'
Det finns en statisk metod för regex-klassen som kan undkomma text åt dig.
[regex]::escape('3.\d{2,}')
3\.\\d\{2,}
Kommentar
Detta undflyr alla reserverade reguljära uttryckstecken, inklusive befintliga omvänt snedstreck som används i teckenklasser. Se till att bara använda den på den del av ditt mönster som du behöver för att fly.
Andra tecken rymningar
Det finns också reserverade tecken som du kan använda för att matcha specialteckentyper.
Följande är några vanliga tecken som inte används:
Escape-tecken | beskrivning |
---|---|
\t |
Matchar en flik |
\n |
Matchar en ny rad |
\r |
Matchar en vagnretur |
Grupper, avbildningar och ersättningar
Grupperingskonstruktioner separerar en indatasträng i understrängar som kan samlas in eller ignoreras. Grupperade understrängar kallas för underuttryck. Som standard samlas underuttryck in i numrerade grupper, men du kan även tilldela namn till dem.
En grupperingskonstruktion är ett reguljärt uttryck omgivet av parenteser. All text som matchas av det omslutna reguljära uttrycket avbildas. I följande exempel delas indatatexten in i två insamlingsgrupper.
'The last logged on user was CONTOSO\jsmith' -match '(.+was )(.+)'
True
Använd den $Matches
automatiska hashtabellvariabeln för att hämta insamlad text.
Texten som representerar hela matchningen lagras vid nyckeln 0
. Observera att hashtabellen $Matches
endast innehåller den första förekomsten av matchande mönster.
$Matches.0
The last logged on user was CONTOSO\jsmith
Avbildningar lagras i numeriska heltalsnycklar som ökar från vänster till höger. Capture 1
innehåller all text tills användarnamnet, capture 2
innehåller bara användarnamnet.
$Matches
Name Value
---- -----
2 CONTOSO\jsmith
1 The last logged on user was
0 The last logged on user was CONTOSO\jsmith
Viktigt!
Nyckeln 0
är ett heltal. Du kan använda valfri Hashtable-metod för att komma åt det lagrade värdet.
PS> 'Good Dog' -match 'Dog'
True
PS> $Matches[0]
Dog
PS> $Matches.Item(0)
Dog
PS> $Matches.0
Dog
Namngivna avbildningar
Som standard lagras avbildningar i stigande numerisk ordning, från vänster till höger.
Du kan också tilldela ett namn till en insamlingsgrupp. Det här namnet blir en nyckel för den $Matches
automatiska hashtabellvariabeln.
I en insamlingsgrupp använder du ?<keyname>
för att lagra insamlade data under en namngiven nyckel.
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
I följande exempel lagras den senaste loggposten i Windows bezbednost-loggen. Det angivna reguljära uttrycket extraherar användarnamnet och domänen från meddelandet och lagrar dem under nycklarna:N för namn och D för domänen.
$log = (Get-EventLog -LogName Security -Newest 1 -InstanceId 4689).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....
Mer information finns i Gruppera konstruktioner i reguljära uttryck.
Ersättningar i reguljära uttryck
Med reguljära uttryck (regex) med operatorn -replace
kan du dynamiskt ersätta text med hjälp av insamlad text.
<input> -replace <original>, <substitute>
<input>
: Strängen som ska genomsökas<original>
: Ett reguljärt uttryck som används för att söka i indatasträngen<substitute>
: Ett regex-ersättningsuttryck för att ersätta matchningar som finns i indatasträngen.
Operanderna <original>
och <substitute>
omfattas av regler för motorn för reguljära uttryck, till exempel tecken som flyr eller ersättningsuttryck. Ersättningsmönstret kan bestå av en eller flera ersättningar tillsammans med literaltecken.
Avbildningsgrupper kan refereras i strängen <substitute>
med hjälp av $
tecknet före gruppidentifieraren.
Två sätt att referera till insamlingsgrupper är efter Tal och Efter Namn.
Efter nummer – Avbildningsgrupper numreras från vänster till höger.
'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$1.$2.$3@contoso.com'
John.D.Smith@contoso.com
Efter namn – Avbildningsgrupper kan också refereras till med namn.
'CONTOSO\Administrator' -replace '\w+\\(?<user>\w+)', 'FABRIKAM\${user}'
FABRIKAM\Administrator
Uttrycket $&
representerar all text som matchas.
'Gobble' -replace 'Gobble', '$& $&'
Gobble Gobble
Varning
$
Eftersom tecknet används i strängexpansion måste du använda literalsträngar med ersättning, eller undvika $
tecknet när du använder dubbla citattecken.
'Hello World' -replace '(\w+) \w+', '$1 Universe'
"Hello World" -replace "(\w+) \w+", "`$1 Universe"
Hello Universe
Hello Universe
Om du vill ha $
som literaltecken använder $$
du dessutom i stället för de normala escape-tecknen. När du använder dubbla citattecken undviker du fortfarande alla instanser av $
för att undvika felaktig ersättning.
'5.72' -replace '(.+)', '$$$1'
"5.72" -replace "(.+)", "`$`$`$1"
$5.72
$5.72
Detaljerad information om ersättningsuttryck finns i Substitutioner i reguljära uttryck.