Delen via


about_Regular_Expressions

Korte beschrijving

Beschrijft reguliere expressies in PowerShell.

Lange beschrijving

Notitie

In dit artikel vindt u de syntaxis en methoden voor het gebruik van reguliere expressies in PowerShell. Niet alle syntaxis wordt besproken. Zie Reguliere expressietaal - Snelzoekgids voor een volledigere naslaginformatie.

Een reguliere expressie is een patroon dat wordt gebruikt om tekst te vinden. Het kan bestaan uit letterlijke tekens, operatoren en andere constructies.

In dit artikel wordt de syntaxis van reguliere expressies in PowerShell beschreven. PowerShell heeft verschillende operators en cmdlets die gebruikmaken van reguliere expressies. U kunt meer lezen over hun syntaxis en gebruik via de onderstaande koppelingen.

Reguliere PowerShell-expressies zijn standaard niet hoofdlettergevoelig. Elke methode die hierboven wordt weergegeven, heeft een andere manier om hoofdlettergevoeligheid af te dwingen.

  • Gebruik voor Select-Stringde parameter CaseSensitive .
  • Gebruik voor operators die gebruikmaken van reguliere expressies de hoofdlettergevoelige versie: -cmatch, -creplaceof -csplit
  • Gebruik voor de switch instructie de -casesensitive optie

Letterlijke tekens

Een reguliere expressie kan een letterlijk teken of een tekenreeks zijn. De expressie zorgt ervoor dat de engine exact overeenkomt met de opgegeven tekst.

# This statement returns true because book contains the string "oo"
'book' -match 'oo'

Tekenklassen

Hoewel letterlijke tekens werken als u het exacte patroon kent, kunt u met tekenklassen minder specifiek zijn.

Tekengroepen

[character group] Hiermee kunt u een willekeurig aantal tekens één keer vergelijken, terwijl [^character group] alleen overeenkomen met tekens die NIET in de groep voorkomen.

# This expression returns true if the pattern matches big, bog, or bug.
'big' -match 'b[iou]g'

Als de lijst met overeenkomende tekens het afbreekstreepje () bevat,- moet het aan het begin of einde van de lijst staan om deze te onderscheiden van een tekenbereikexpressie.

Tekenbereiken

Een patroon kan ook een reeks tekens zijn. De tekens kunnen alfabetisch [A-Z], numeriek [0-9]of zelfs OP ASCII zijn gebaseerd [ -~] (allemaal afdrukbare tekens).

# This expression returns true if the pattern matches any 2 digit number.
42 -match '[0-9][0-9]'

Getallen

De \d tekenklasse komt overeen met elk decimaal cijfer. Komt daarentegen \D overeen met elk niet-decimaal cijfer.

# This expression returns true if it matches a server name.
# (Server-01 - Server-99).
'Server-01' -match 'Server-\d\d'

Word tekens

De \w tekenklasse komt overeen met elk woordteken [a-zA-Z_0-9]. Als u een niet-woordteken wilt vinden, gebruikt \Wu .

# This expression returns true.
# The pattern matches the first word character 'B'.
'Book' -match '\w'

Jokertekens

De punt (.) is een jokerteken in reguliere expressies. Het komt overeen met elk teken, met uitzondering van een nieuwe regel (\n).

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

Witruimte

U kunt elke witruimte koppelen aan de \s tekenklasse. U kunt alle niet-witruimtetekens koppelen aan \S. U kunt letterlijke spatietekens vergelijken met .

# 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- '

Kwantoren

Kwantificatoren bepalen hoeveel exemplaren van elk element aanwezig moeten zijn in de invoertekenreeks.

Hier volgen enkele van de beschikbare kwantificatoren in PowerShell:

Kwantor Description
* Nul of meer keer.
+ Een of meer keren.
? Nul of één keer.
{n,m} Ten minste n, maar niet meer dan m keer.

Het sterretje (*) komt nul of meer keer overeen met het vorige element. Het resultaat is dat zelfs een invoertekenreeks zonder het element een overeenkomst zou zijn.

# This returns true for all account name strings even if the name is absent.
'ACCOUNT NAME:    Administrator' -match 'ACCOUNT NAME:\s*\w*'

Het plusteken (+) komt een of meer keer overeen met het vorige element.

# This returns true if it matches any server name.
'DC-01' -match '[A-Z]+-\d\d'

Het vraagteken ? komt overeen met het vorige element nul of eenmalig. Net als een sterretje *komt het zelfs overeen met tekenreeksen waarin het element ontbreekt.

# This returns true for any server name, even server names without dashes.
'SERVER01' -match '[A-Z]+-?\d\d'

De {n, m} kwantificator kan op verschillende manieren worden gebruikt om gedetailleerde controle over de kwantificator mogelijk te maken. Het tweede element m en de komma , zijn optioneel.

Kwantor Description
{n} n Exact aantal keren overeenkomen.
{n,} Minstens n een aantal keren overeenkomen.
{n,m} Overeenkomst tussen n en m aantal keren.
# This returns true if it matches any phone number.
'111-222-3333' -match '\d{3}-\d{3}-\d{4}'

Ankers

Met ankers kunt u ervoor zorgen dat een overeenkomst slaagt of mislukt op basis van de overeenkomende positie binnen de invoertekenreeks.

De twee veelgebruikte ankers zijn ^ en $. De caret ^ komt overeen met het begin van een tekenreeks, en $, die overeenkomt met het einde van een tekenreeks. Met de ankers kunt u uw tekst op een specifieke positie vinden en ongewenste tekens verwijderen.

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

Notitie

Wanneer u een regex met een $ anker definieert, moet u de regex insluiten met enkele aanhalingstekens (') in plaats van dubbele aanhalingstekens ("), anders breidt PowerShell de expressie uit als een variabele.

Wanneer u ankers gebruikt in PowerShell, moet u het verschil begrijpen tussen de opties voor reguliere expressies met één regel en meerdere regels.

  • Meerdere regels: de modus Meerdere regels dwingt ^ en $ af om het begineinde van elke REGEL te vinden in plaats van het begin en einde van de invoertekenreeks.
  • Singleline: in de modus Singleline wordt de invoertekenreeks behandeld als een SingleLine. Het zorgt ervoor dat het . teken overeenkomt met elk teken (inclusief nieuwe regels), in plaats van dat het overeenkomt met elk teken, BEHALVE de nieuwe regel \n.

Als u meer wilt weten over deze opties en hoe u deze kunt gebruiken, gaat u naar reguliere expressietaal - Snelzoekgids.

Escape-tekens

De backslash (\) wordt gebruikt om tekens te escapen, zodat ze niet worden geparseerd door de reguliere expressie-engine.

De volgende tekens zijn gereserveerd: []().\^$|?*+{}.

U moet deze tekens in uw patronen escapen om ze in uw invoertekenreeksen overeen te laten komen.

# 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,}'

Er is een statische methode van de regex-klasse die tekst voor u kan ontsnappen.

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

Notitie

Hiermee worden alle gereserveerde reguliere expressietekens ontsnapt, inclusief bestaande backslashes die worden gebruikt in tekenklassen. Zorg ervoor dat u deze alleen gebruikt voor het gedeelte van uw patroon dat u nodig hebt om te ontsnappen.

Escapes voor andere tekens

Er zijn ook gereserveerde teken escapes die u kunt gebruiken om speciale tekentypen te vinden.

Hier volgen enkele veelgebruikte escapes voor tekens:

Escape-teken Description
\t Komt overeen met een tabblad
\n Komt overeen met een nieuwe regel
\r Komt overeen met een regelterugloop

Groepen, opnamen en vervangingen

Groepeerconstructies scheiden een invoertekenreeks in subtekenreeksen die kunnen worden vastgelegd of genegeerd. Gegroepeerde subtekenreeksen worden subexpressies genoemd. Subexpressies worden standaard vastgelegd in genummerde groepen, maar u kunt er ook namen aan toewijzen.

Een groeperingsconstructie is een reguliere expressie tussen haakjes. Alle tekst die overeenkomt met de ingesloten reguliere expressie wordt vastgelegd. In het volgende voorbeeld wordt de invoertekst opgesplitst in twee vastleggende groepen.

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

Gebruik de $Matches automatische variabele Hashtable om vastgelegde tekst op te halen. De tekst die de volledige overeenkomst vertegenwoordigt, wordt opgeslagen op sleutel 0. Het is belangrijk te weten dat de $Matches hashtabel alleen het eerste exemplaar van een overeenkomend patroon bevat.

$Matches.0
The last logged on user was CONTOSO\jsmith

Opnamen worden opgeslagen in numerieke toetsen voor gehele getallen die van links naar rechts toenemen. Capture 1 bevat alle tekst tot de gebruikersnaam, capture 2 bevat alleen de gebruikersnaam.

$Matches
Name           Value
----           -----
2              CONTOSO\jsmith
1              The last logged on user was
0              The last logged on user was CONTOSO\jsmith

Belangrijk

De 0 sleutel is een geheel getal. U kunt elke Hashtable-methode gebruiken om toegang te krijgen tot de waarde die is opgeslagen.

PS> 'Good Dog' -match 'Dog'
True

PS> $Matches[0]
Dog

PS> $Matches.Item(0)
Dog

PS> $Matches.0
Dog

Benoemde opnamen

Standaard worden opnamen opgeslagen in oplopende numerieke volgorde, van links naar rechts. U kunt ook een naam toewijzen aan een vastleggende groep. Deze naam wordt een sleutel op de $Matches automatische hashtabelvariabele.

Gebruik in een vastleggende groep ?<keyname> om vastgelegde gegevens op te slaan onder een benoemde sleutel.

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

In het volgende voorbeeld wordt de nieuwste logboekvermelding opgeslagen in het Windows-beveiliging Logboek. De opgegeven reguliere expressie extraheert de gebruikersnaam en het domein uit het bericht en slaat deze op onder de sleutels:N voor naam en D voor domein.

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

Zie Groeperingsconstructies in reguliere expressies voor meer informatie.

Vervangingen in reguliere expressies

Met behulp van de reguliere expressies (regex) met de -replace operator kunt u tekst dynamisch vervangen met behulp van vastgelegde tekst.

<input> -replace <original>, <substitute>

  • <input>: De tekenreeks die moet worden doorzocht
  • <original>: Een reguliere expressie die wordt gebruikt om de invoertekenreeks te doorzoeken
  • <substitute>: Een regex-vervangingsexpressie ter vervanging van overeenkomsten in de invoertekenreeks.

De <original> operanden en <substitute> zijn onderworpen aan regels van de engine voor reguliere expressies, zoals escape-tekens of vervangingsexpressies. Het vervangingspatroon kan bestaan uit een of meer vervangingen, samen met letterlijke tekens.

In de <substitute> tekenreeks kan naar capture-groepen worden verwezen met behulp van het $ teken vóór de groeps-id.

Twee manieren om te verwijzen naar vastleggende groepen zijn op getal en op naam.

  • Op getal: Groepen van links naar rechts worden genummerd.

    'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$1.$2.$3@contoso.com'
    
    John.D.Smith@contoso.com
    
  • Op naam: er kan ook naar Groepen worden verwezen op naam.

    'CONTOSO\Administrator' -replace '\w+\\(?<user>\w+)', 'FABRIKAM\${user}'
    
    FABRIKAM\Administrator
    

De $& expressie vertegenwoordigt alle overeenkomende tekst.

'Gobble' -replace 'Gobble', '$& $&'
Gobble Gobble

Waarschuwing

Omdat het $ teken wordt gebruikt in tekenreeksuitbreiding, moet u letterlijke tekenreeksen gebruiken met vervanging of het $ teken escapen wanneer u dubbele aanhalingstekens gebruikt.

'Hello World' -replace '(\w+) \w+', '$1 Universe'
"Hello World" -replace "(\w+) \w+", "`$1 Universe"
Hello Universe
Hello Universe

Als u de $ als letterlijk teken wilt gebruiken, gebruikt $$ u bovendien in plaats van de normale escape-tekens. Wanneer u dubbele aanhalingstekens gebruikt, moet u nog steeds alle exemplaren van $ escapen om onjuiste vervanging te voorkomen.

'5.72' -replace '(.+)', '$$$1'
"5.72" -replace "(.+)", "`$`$`$1"
$5.72
$5.72

Zie Vervangingen in reguliere expressies voor gedetailleerde informatie over vervangingsexpressies.

Zie ook