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, inte all syntax beskrivs. 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.

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-Stringanvä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 ett regex som innehåller ett $ fästpunkt ska du omsluta regexen med enkla citattecken (') i stället för dubbla citattecken (") eller så expanderar PowerShell uttrycket som en variabel.

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 $Matchesautomatiska 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 $Matchesautomatiska 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-säkerhet-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-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....

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.

Se även