about_Regular_Expressions

Rövid leírás

A PowerShell szokásos kifejezéseit ismerteti.

Hosszú leírás

Feljegyzés

Ez a cikk a normál kifejezések PowerShellben való használatára szolgáló szintaxist és metódusokat mutatja be, és nem minden szintaxist tárgyalunk. A teljesebb referenciáért tekintse meg a Regular Expression Language – Quick Reference (Reguláris kifejezés nyelve – gyorshivatkozás) című témakört.

A reguláris kifejezés a szövegnek megfelelő minta. Konstans karakterekből, operátorokból és egyéb szerkezetekből állhat.

Ez a cikk a PowerShell szokásos kifejezésszintaxisát mutatja be. A PowerShell több olyan operátort és parancsmagot is használ, amelyek normál kifejezéseket használnak. Szintaxisukról és használatukról az alábbi hivatkozásokon olvashat bővebben.

A PowerShell normál kifejezései alapértelmezés szerint nem érzékenyek a kis- és nagybetűkre. A fentiekben bemutatott módszerek eltérő módon kényszerítik a kis- és nagybetűk érzékenységét.

  • Ehhez Select-Stringhasználja a CaseSensitive paramétert .
  • Normál kifejezéseket használó operátorok esetén használja a kis- és nagybetűket megkülönböztető verziót: -cmatch, -creplacevagy -csplit
  • Az utasításhoz switch használja a -casesensitive

Karakterkonstansok

A reguláris kifejezés lehet literális karakter vagy sztring. A kifejezés hatására a motor pontosan megfelel a megadott szövegnek.

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

Karakterosztályok

Bár a karakterkonstansok akkor működnek, ha ismeri a pontos mintát, a karakterosztályok lehetővé teszik, hogy kevésbé specifikusak legyenek.

Karaktercsoportok

[character group] lehetővé teszi, hogy egyszerre tetszőleges számú karaktert egyezzen meg, míg [^character group] csak a CSOPORTBAN NEM szereplő karaktereket.

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

Ha az egyező karakterek listája tartalmazza a kötőjel karaktert (-), a karaktertartomány-kifejezéstől való megkülönböztetéséhez a lista elején vagy végén kell lennie.

Karaktertartományok

A minta karaktertartomány is lehet. A karakterek lehetnek betűrendesek [A-Z], numerikusak [0-9]vagy akár ASCII-alapúak [ -~] (az összes nyomtatható karakter).

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

Telefonszámok

A \d karakterosztály minden tizedesjegynek megfelel. Ezzel szemben minden \D nem decimális számjegynek egyeznie kell.

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

Word-karakterek

A \w karakterosztály minden szó karakterével [a-zA-Z_0-9]megegyezik. Ha nem szó nélküli karaktereket szeretne használni, használja \Wa következőt: .

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

Helyettesítő karakterek

A pont (.) egy helyettesítő karakter a reguláris kifejezésekben. Minden karakternek megfelel, kivéve az új vonalat (\n).

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

Térköz

Tetszőleges szóköz karaktert egyeztethet a \s karakterosztálysal. A nem térbeli karakterekkel \Segyezhet. A literális szóköz karaktereket a .

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

Kvantitátorok

A kvantátorok azt szabályozzák, hogy az egyes elemek hány példánya legyen jelen a bemeneti sztringben.

A PowerShellben elérhető kvantitátorok közül néhány a következő:

Quantifier Leírás
* Nulla vagy több alkalommal.
+ Egy vagy több alkalommal.
? Nulla vagy egyszer.
{n,m} Legalábbis n, de nem többször m .

A csillag (*) egyezik az előző elem nullával vagy több alkalommal. Az eredmény az, hogy még az elem nélküli bemeneti sztring is egyezik.

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

A pluszjel (+) egy vagy több alkalommal megfelel az előző elemnek.

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

A kérdőjel ? egyezik az előző nullával vagy egyszer. A csillaghoz *hasonlóan a sztringek is megegyeznek azokkal a sztringekkel, ahol az elem hiányzik.

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

A {n, m} kvantáló többféleképpen is használható a kvantáló részletes vezérlésének engedélyezéséhez. A második elem m és a vessző , megadása nem kötelező.

Quantifier Leírás
{n} Pontosan n meg kell egyeznie a pontos számmal.
{n,} Legalább n hányszor egyezzen meg.
{n,m} Egyezés a kettő között n és m az időpontok száma között.
# This returns true if it matches any phone number.
'111-222-3333' -match '\d{3}-\d{3}-\d{4}'

Horgonyok

A horgonyok lehetővé teszik, hogy a bemeneti sztringen belüli egyezések pozíciója alapján egyezés sikeres vagy sikertelen legyen.

A két gyakran használt horgony és ^$. A simító ^ megegyezik egy sztring elejével, és $egy sztring végével. A horgonyok lehetővé teszik, hogy egy adott pozícióban egyezzen a szövegével, miközben elveti a nem kívánt karaktereket is.

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

Feljegyzés

Horgonyt tartalmazó $ regex definiálásakor ügyeljen arra, hogy a regexet idézőjelek () helyett egyszeri idézőjelek ('") használatával zárja be, vagy a PowerShell változóként bontja ki a kifejezést.

Ha horgonyokat használ a PowerShellben, ismernie kell az egysoros és a többsoros reguláris kifejezési beállítások közötti különbséget.

  • Többsoros: A többsoros mód a bemeneti sztring eleje és $ vége helyett az összes SOR elejét és végét kényszeríti^.
  • Egysoros: Az egysoros mód a bemeneti sztringet egysorosként kezeli. Kényszeríti a . karaktert, hogy megfeleljen minden karakternek (beleértve az új vonalakat is), ahelyett, hogy minden karaktert egyeztet, KIVÉVE az új vonalat \n.

Ha többet szeretne megtudni ezekről a lehetőségekről és azok használatáról, látogasson el a Reguláris kifejezés nyelve – rövid útmutató.

Karakterek menekülése

A fordított perjel (\) a karakterek feloldására szolgál, így a normál kifejezésmotor nem elemzi őket.

A következő karakterek vannak fenntartva: []().\^$|?*+{}.

Ezeket a karaktereket a mintáiban el kell menekülnie, hogy megfeleljen a bemeneti sztringeknek.

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

A regex osztálynak van egy statikus metódusa, amely képes feloldani a szöveget.

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

Feljegyzés

Ez feloldja az összes fenntartott reguláris kifejezés karakterét, beleértve a karakterosztályokban használt meglévő fordított perjeleket is. Ügyeljen arra, hogy csak a minta azon részén használja, amelyet el kell menekülnie.

Egyéb karakterek feloldása

A speciális karaktertípusokhoz fenntartott karakterkioldók is használhatók.

Az alábbiakban néhány gyakran használt karaktermenekülést ismertetünk:

Karakteres feloldás Leírás
\t Egy lap egyezése
\n Egy új vonalnak felel meg
\r Megegyezik egy kocsivissza

Csoportok, rögzítések és helyettesítések

A csoportosítási szerkezetek egy bemeneti sztringet olyan részsztringekre választanak el, amelyek rögzíthetők vagy figyelmen kívül hagyhatók. A csoportosított alsztringeket alexpresszióknak nevezzük. Alapértelmezés szerint az alkifejezések számozott csoportokban vannak rögzítve, de hozzájuk is rendelhet neveket.

A csoportosítási szerkezet egy zárójelekkel körülvett reguláris kifejezés. A rendszer minden olyan szöveget rögzít, amely megfelel a zárt reguláris kifejezésnek. Az alábbi példa két rögzítési csoportra bontja a bemeneti szöveget.

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

$MatchesA Kivonatoló automatikus változóval lekérheti a rögzített szöveget. A teljes egyezést jelképező szöveg a kulcsban 0lesz tárolva. Fontos megjegyezni, hogy a $Matches kivonatoló csak az egyező minták első előfordulását tartalmazza.

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

A rögzítéseket numerikus egész számbillentyűk tárolják, amelyek balról jobbra növekednek. A Capture 1 az összes szöveget tartalmazza, amíg a felhasználónév, a rögzítés 2 csak a felhasználónevet tartalmazza.

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

Fontos

A 0 kulcs egy egész szám. A tárolt érték eléréséhez bármely Kivonatoló metódust használhat.

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

PS> $Matches[0]
Dog

PS> $Matches.Item(0)
Dog

PS> $Matches.0
Dog

Elnevezett rögzítések

Alapértelmezés szerint a rögzítések növekvő számsorrendben vannak tárolva, balról jobbra. Nevet is hozzárendelhet egy rögzítési csoporthoz. Ez a név a Kivonatoló automatikus változó kulcsává $Matchesválik.

Egy rögzítési csoportban a rögzített adatok nevesített kulcs alatt való tárolására használható ?<keyname> .

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

Az alábbi példa a legújabb naplóbejegyzést tárolja a Windows biztonság Naplóban. A megadott reguláris kifejezés kinyeri a felhasználónevet és a tartományt az üzenetből, és a következő kulcsok alatt tárolja őket: N a névhez és d a tartományhoz.

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

További információ: Szerkezetek csoportosítása reguláris kifejezésekben.

Helyettesítések reguláris kifejezésekben

A reguláris kifejezések operátorral való -replace használata lehetővé teszi a szöveg dinamikus cseréjét rögzített szöveg használatával.

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

  • <input>: A keresendő sztring
  • <original>: A bemeneti sztringben való kereséshez használt reguláris kifejezés
  • <substitute>: A bemeneti sztringben található egyezések lecserélésére szolgáló reguláris kifejezéshelyettesítő kifejezés.

Feljegyzés

<substitute> Az <original> operandusokra a reguláris kifejezésmotor szabályai vonatkoznak, például a karakteres menekülésre.

A csoportok rögzítésére a sztring hivatkozhat <substitute> . A helyettesítés a csoportazonosító előtti karakter használatával $ történik.

A rögzítési csoportokra kétféleképpen hivatkozhat: Szám és Név szerint.

  • Szám szerint – A csoportok rögzítése balról jobbra számozott.

    'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$1.$2.$3@contoso.com'
    
    John.D.Smith@contoso.com
    
  • Név szerint – A csoportok rögzítése név alapján is hivatkozható.

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

A $& kifejezés az összes egyező szöveget jelöli.

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

Figyelmeztetés

Mivel a karaktert sztringbővítésben $ használják, literális sztringeket kell használnia helyettesítéssel, vagy el kell menekülnie a $ karakterből dupla idézőjelek használatakor.

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

Továbbá, ha literális karaktert szeretne $ használni, használja $$ a normál feloldó karakterek helyett. Dupla idézőjelek használata esetén továbbra is meneküljön az összes példánytól $ , hogy elkerülje a helytelen helyettesítést.

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

További információ: Helyettesítések a reguláris kifejezésekben.

Lásd még