Dela via


Om reguljära uttryck

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, 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ägesokänsliga som standard. Varje metod som visas ovan har ett annat sätt att tvinga skiftlägeskänslighet.

Metod Skiftlägeskänslighet
Select-String använd -CaseSensitive växel
switch Uttalande använd alternativet -casesensitive
operatorer prefix med "c" (-cmatch, -csplit, eller -creplace)

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

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

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

Blanksteg

Blanksteg matchas med hjälp av teckenklassen \s . Alla icke-blankstegstecken matchas med .\S Literala blankstegstecken ' ' kan också användas.

# This expression returns true.
# The pattern uses both methods to match the 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 ä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 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 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$'

Anteckning

När du definierar ett regex som innehåller ett $ fästpunkt ska du omsluta regex 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 enda rad och flera linjer.

  • Flera rader: Flerradsläge tvingar ^ och $ matchar början av varje RAD i stället för början och slutet av indatasträngen.
  • Enkelrad: Singleline-läget behandlar indatasträngen som en singleline. Det tvingar . tecknet att matcha varje tecken (inklusive nya linjer), i stället för att matcha varje tecken UTOM den nya rad \n.

Om du vill läsa mer om de här alternativen och hur du använder dem kan du gå till språk för reguljärt uttryck – snabbreferens.

Undantagna 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 i regex-klassen som kan undkomma text åt dig.

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

Anteckning

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

Andra tecken rymningar

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

Följande är några vanliga teckenundsteg:

Teckenrymning 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.

$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 hjälp av reguljära uttryck 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 ersättningsuttryck för reguljära uttryck som ersätter matchningar som finns i indatasträngen.

Anteckning

Operanderna <original> och <substitute> omfattas av regler för motorn för reguljära uttryck, till exempel teckenundanskap.

Du kan referera till insamlingsgrupper i strängen <substitute> . Ersättningen görs 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 – Avbildning 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

Mer information finns i Ersättningar i reguljära uttryck.

Se även

about_Comparison_Operators

about_Operators