Dela via


about_Regular_Expressions

Kort beskrivning

Beskriver reguljära uttryck i PowerShell.

Lång beskrivning

Anteckning

Den här artikeln visar syntaxen och metoderna för att använda reguljära uttryck i PowerShell. All syntax diskuteras inte. En mer fullständig referens finns i Språk för reguljära 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ägesokä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 skiftlägeskänslig version: -cmatch, -creplaceeller -csplit
  • För -instruktionen switch använder du -casesensitive alternativet

Teckenliteraraler

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

Teckenliteraraler fungerar om du känner till det exakta mönstret, men med teckenklasser kan du vara mindre specifik.

Teckengrupper

[character group] gör att du kan matcha valfritt antal tecken en gång, medan [^character group] endast matchar tecken SOM INTE finns 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 den vara i början eller slutet av listan för att skilja den 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]'

Tal

Teckenklassen \d matchar valfri decimalsiffra. Omvänt \D matchar alla icke-decimalsiffror.

# 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 andra tecken än ordtecken 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 utom en ny rad (\n).

# This expression returns true.
# The pattern matches any 4 characters except the newline.
'a1\ ' -match '....'

Blanksteg

Du kan matcha alla blankstegstecken med teckenklassen \s . Du kan matcha alla icke-blankstegstecken med \S. Du kan matcha literaltecken 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 Description
* 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 föregående element noll eller en gång. Precis som asterisk *matchar den till och med 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 Description
{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}'

Ankare

Med fästpunkter kan du göra så 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 oönskade tecken ignoreras.

# The pattern expects the string 'fish' to be the only thing on the line.
# This returns FALSE.
'fishing' -match '^fish$'

Anteckning

När du definierar ett regex som innehåller en $ fästpunkt, se till att omsluta regex med enkla citattecken (') i stället för dubbla citattecken (") 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 ledningar.

  • Flerradsläge: Flerradsläge 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 singleline. 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 Referens för reguljärt uttrycksspråk – snabbreferens.

Undantagstecken

Omvänt snedstreck (\) används för att escape-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 i regex-klassen som kan escape-text åt dig.

[regex]::escape('3.\d{2,}')
3\.\\d\{2,}

Anteckning

Detta förhindrar 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 mönstret som du behöver fly från.

Andra tecken rymningar

Det finns också undantag för reserverade tecken som du kan använda för att matcha specialteckentyper.

Här följer några vanliga teckenundsteg:

Escape-tecken Description
\t Matchar en flik
\n Matchar en ny rad
\r Matchar en vagnretur

Grupper, avbildningar och ersättningar

Grupperingskonstruktioner separerar en indatasträng i delsträngar som kan samlas in eller ignoreras. Grupperade delsträngar kallas för underuttryck. Som standard registreras underuttryck 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 upp i två grupper.

'The last logged on user was CONTOSO\jsmith' -match '(.+was )(.+)'
True

Använd den $Matches automatiska Hashtable-variabeln 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 avbildningsgrupp. Det här namnet blir en nyckel i den $Matches automatiska Hashtable-variabeln.

I en avbildningsgrupp använder ?<keyname> du 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 teckenundanskapning eller ersättningsuttryck. Ersättningsmönstret kan bestå av en eller flera ersättningar tillsammans med literaltecken.

Avbildningsgrupper kan refereras till 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 – avbildning Grupper 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 – Avbilda Grupper 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 escape-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 ett 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 Ersättningar i reguljära uttryck.

Se även