Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Korte beschrijving
Beschrijft reguliere expressies in PowerShell.
Lange beschrijving
Notitie
Dit artikel bevat de syntaxis en methoden voor het gebruik van reguliere expressies in PowerShell. Het omvat niet alle mogelijke expressies. Zie de Reguliere expressietaal - Snelzoekgidsvoor een volledigere referentie.
Een regular expression is een patroon dat wordt gebruikt om tekst te matchen. Het kan bestaan uit letterlijke tekens, operatoren en andere constructies. PowerShell maakt gebruik van de .NET regex--engine.
In dit artikel wordt de syntaxis van de reguliere expressie in PowerShell gedemonstreert. PowerShell heeft verschillende operators en cmdlets die gebruikmaken van reguliere expressies. Meer informatie over de syntaxis en het gebruik vindt u in de onderstaande koppelingen.
Reguliere PowerShell-expressies zijn standaard niet hoofdlettergevoelig. Elke bovenstaande methode 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 tekst die is opgegeven.
# 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] stelt u in staat om een willekeurig aantal tekens één keer overeen te laten komen, terwijl [^character group] alleen overeenkomt 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 deze zich aan het begin of einde van de lijst bevinden om deze te onderscheiden van een tekenbereikexpressie.
Tekenbereiken
Een patroon kan ook een reeks tekens zijn. De tekens kunnen alfabetisch zijn [A-Z], numerieke [0-9]of zelfs op ASCII gebaseerde [ -~] (alle afdrukbare tekens).
# This expression returns true if the pattern matches any 2 digit number.
42 -match '[0-9][0-9]'
Cijfers
De \d tekenklasse komt overeen met een decimaal cijfer. Omgekeerd komt \D overeen met elk teken, behalve decimale cijfers.
# 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 een woordteken [a-zA-Z_0-9]. Om elk niet-woord teken te matchen, gebruik \W.
# This expression returns true.
# The pattern matches the first word character 'B'.
'Book' -match '\w'
Jokertekens
De punt (.) is een wildcardteken in reguliere expressies. Het komt overeen met een willekeurig teken, behalve een nieuwe regel (\n).
# This expression returns true.
# The pattern matches any 4 characters except the newline.
'a1\ ' -match '....'
Witte ruimte
U kunt een witruimteteken vergelijken met de \s tekenklasse. U kunt een niet-witruimteteken vergelijken met \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 kwantificatoren die beschikbaar zijn in PowerShell:
| Kwantor | Beschrijving |
|---|---|
* |
Nul of meer keren. |
+ |
Een of meer keren. |
? |
Nul of één keer. |
{n,m} |
Minstens n, maar niet meer dan m keer. |
Het sterretje (*) komt overeen met het vorige element nul of meer keren. Het resultaat is dat zelfs een invoertekenreeks zonder element een match 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 keren overeen met het vorige element.
# This returns true if it matches any server name.
'DC-01' -match '[A-Z]+-\d\d'
Het vraagteken ? overeenkomt met het vorige element nul of één keer. Net als sterretje *, komt het zelfs overeen met tekenreeksen waar het element afwezig is.
# 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 | Beschrijving |
|---|---|
{n} |
Exact n keer overeenkomen. |
{n,} |
Komt ten minste n keren overeen. |
{n,m} |
Overeenkomen 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 positie van de overeenkomsten in 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 vergelijken terwijl u ook ongewenste tekens negeert.
# 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 tussen enkele aanhalingstekens plaatsen ('). Als u dubbele aanhalingstekens (") gebruikt, interpreteert PowerShell de tekenreeks als een uitbreidbare variabele-expressie.
Wanneer u ankers in PowerShell gebruikt, moet u het verschil tussen singleline en multiline opties voor reguliere expressies begrijpen.
-
Multiline: De modus Multiline dwingt
^en$om overeen te komen met het begin en einde van elke REGEL in plaats van met het begin en einde van de invoerreeks. -
Singleline-: de modus Singleline behandelt de invoertekenreeks als een Singleline-.
Het dwingt het
.-teken om overeen te komen met elk teken (inclusief nieuwe regels), in plaats van overeen te komen met elk teken behalve de nieuwe regel\n.
Als u meer wilt lezen over deze opties en hoe u deze kunt gebruiken, gaat u naar de 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 deze in uw invoertekenreeksen te vinden.
# 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 escapen.
[regex]::Escape('3.\d{2,}')
3\.\\d\{2,}
Notitie
Hiermee worden alle gereserveerde expressietekens genegeerd, inclusief bestaande backslashes welke worden gebruikt in tekenklassen. Zorg ervoor dat u deze alleen gebruikt voor het gedeelte van uw patroon dat u moet ontsnappen.
Andere escape-characters
Er zijn ook gereserveerde escape-karakters die u kunt gebruiken om overeen te komen met speciale tekentypen.
Dit zijn enkele veelgebruikte escape-karakters:
| Escapeteken | Beschrijving |
|---|---|
\t |
Komt overeen met een tabblad |
\n |
Komt overeen met een nieuwe regel |
\r |
Komt overeen met een regelterugloop |
Groepen, opnamen en vervangingen
Door constructies te groeperen wordt een invoertekenreeks gescheiden 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 groepen die worden vastgelegd.
'The last logged on user was CONTOSO\jsmith' -match '(.+was )(.+)'
True
Gebruik de $MatchesHashtable automatische variabele om vastgelegde tekst op te halen.
De tekst die de hele match vertegenwoordigt, wordt opgeslagen op de 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
Captures worden opgeslagen in numerieke integer sleutels die van links naar rechts toenemen. De opname 1 bevat alle tekst tot aan de gebruikersnaam, de opname 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 integer. U kunt elke Hashtable-methode gebruiken om toegang te krijgen tot de opgeslagen waarde.
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 vastleggroep. Deze naam wordt een sleutel in de $MatchesHashtable automatische variabele.
Gebruik in een opslaggroep ?<keyname> om vastgelegde gegevens onder een genaamde sleutel op te slaan.
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-beveiligingslogboek. 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 expressiesvoor meer informatie.
Vervangingen in reguliere expressies
Met behulp van de reguliere expressies (regex) met de operator -replace 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 om overeenkomsten in de invoertekenreeks te vervangen.
De <original> en <substitute> operanden zijn onderworpen aan regels van de engine voor reguliere expressies, zoals karakterontsnapping of vervangingsexpressies. Het vervangingspatroon kan bestaan uit een of meer vervangingen, samen met letterlijke tekens.
Er kan naar groepen worden verwezen in de <substitute>-tekenreeks met het $-teken vóór de groep-id.
Twee manieren om te verwijzen naar opvanggroepen zijn door middel van het nummer en de naam .
Door Nummer - Groepen worden van links naar rechts genummerd bij vastlegging.
'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$1.$2.$3@contoso.com'John.D.Smith@contoso.comOp Naam - Capture-groepen kan ook 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 met vervanging gebruiken 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 $$ in plaats van de normale escapetekens. Wanneer u dubbele aanhalingstekens gebruikt, moet u nog steeds alle gevallen van $ escapen om onjuiste vervanging te voorkomen.
'5.72' -replace '(.+)', '$$$1'
"5.72" -replace "(.+)", "`$`$`$1"
$5.72
$5.72
Zie Vervangingen in reguliere expressiesvoor gedetailleerde informatie over vervangingsexpressies.
Opmerkingen in reguliere expressies
Reguliere expressies kunnen zeer complex en moeilijk te lezen zijn. U kunt opmerkingen gebruiken om ze begrijpelijker te maken. Er zijn twee typen opmerkingen toegestaan in reguliere expressies.
- Inline-opmerking (
(?#)) - Opmerking einde van regel (
#)
Zie de Opmerkingen bij reguliere expressies sectie van about_Commentsvoor meer informatie.