about_reguláris_kifejezések

Rövid leírás

A PowerShell szokásos kifejezéseit ismerteti.

Hosszú leírás

Jegyzet

Ez a cikk a normál kifejezések PowerShellben való használatára szolgáló szintaxist és metódusokat mutatja be. Nem terjed ki az összes lehetséges kifejezésre. A teljesebb referenciát a Reguláris kifejezésnyelv – gyorshivatkozásicímű témakörben talál.

A reguláris kifejezés olyan minta, amelyet a szöveg illesztésére használnak. Konstans karakterekből, operátorokból és egyéb szerkezetekből állhat. A PowerShell a .NET regex motort használja.

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 érvényesítik a kis- és nagybetűk megkülönböztetését.

  • Select-Stringesetén haszná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
  • A switch utasításhoz használja a -CaseSensitive lehetőséget

Karakterkonstansok

A reguláris kifejezés lehet literális karakter vagy karakterlánc. 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 bármilyen számú karaktert egyszer illesszen, míg [^character group] csak azokat a karaktereket illeszti, amelyek nincsenek a csoportban.

# 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őjelet (-), akkor a lista elején vagy végén kell lennie, hogy megkülönböztesse a karaktertartomány-kifejezéstől.

Karaktertartományok

A minta karaktertartomány is lehet. A karakterek lehetnek betűrendes [A-Z], numerikus [0-9]vagy akár ASCII-alapú [ -~] (minden nyomtatható karakter).

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

Számok

A \d karakterosztály minden tizedesjegynek megfelel. Ezzel szemben a \D a tizedesjegyek kivételével minden karaktert egyeztet.

# 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 bármely szókarakterhez illeszkedik [a-zA-Z_0-9]. Ha nem szó nélküli karaktereket szeretne használni, használja a \W.

# 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. Az új vonal (\n) kivételével bármely karakterrel megegyezik.

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

Szóköz

Bármely szóköz karakter megfeleltethető a \s karakterosztálynak. Bármely nem szóköz karaktert megkereshet a \Ssegítségével. A literális szóköz karaktereket az használatával illesztheti.

# 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ő:

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

A csillag (*) az előző elemet nulla vagy több alkalommal egyezteti. Az eredmény az, hogy még az elem nélküli bemeneti karakterlánc 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 megegyezik az előző elemmel.

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

A kérdőjel ? az előző elemmel nullaszor vagy egyszer egyezik meg. A csillaghoz *hasonlóan még azokat a karakterláncokat is illeszti, 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ő , nem kötelező.

Kvantor Leírás
{n} Egyezzen meg PONTOSAN n alkalommal.
{n,} Egyezzen legalább n alkalommal.
{n,m} n és m számú egyezés.
# 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 az egyezés sikeres legyen, vagy meghiúsuljon.

A két gyakran használt horgony ^ és $. A kalapjel ^ egy sztring elejével egyezik meg, és a $egy sztring végét jelzi. 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$'

Jegyzet

Horgonyt ($) tartalmazó regex definiálásakor a regexet egyetlen idézőjelbe (') kell belefoglalnia. Ha kettős idézőjeleket (") használ, a PowerShell kibontható változókifejezésként értelmezi a sztringet.

Ha horgonyokat használ a PowerShellben, ismernie kell a egysoros és többsoros reguláris kifejezési lehetőségek közötti különbséget.

  • többsoros: A többsoros mód arra kényszeríti ^-t és $-t, hogy a BEMENETI SZTRING kezdete és vége helyett minden SOR elejéhez és végéhez igazodjanak.
  • Egysoros: Az egysoros mód a bemeneti sztringet egysoros kezeli. Kényszeríti a . karaktert, hogy illeszkedjen minden karakterhez (beleértve az újsorokat is), ahelyett, hogy minden karakterhez illeszkedne, KIVÉVE az újsort \n.

Ha többet szeretne megtudni ezekről a lehetőségekről és azok használatáról, látogasson el a Regular Expression Language – Gyors referencia.

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 kódolnia kell ahhoz, hogy megfeleljenek 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 megkerülni a szöveget.

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

Jegyzet

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 karakter escape-ek

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:

Karakter escape Leírás
\t Egy fül 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

A rögzített szöveg lekéréséhez használja a hashtábla automatikus változót $Matches. A teljes mérkőzést reprezentáló szöveg a 0kulcson van tárolva. Fontos megjegyezni, hogy a $Matches hasítótábla 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ám kulcsok tárolják, amelyek értékükben balról jobbra növekednek. Capture 1 tartalmazza az összes szöveget a felhasználónévig, capture 2 pedig csak a felhasználónevet.

$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ármilyen 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. Egy nevet is hozzárendelhet egy rögzítési csoporthoz. Ez a név egy kulcs lesz a $Matcheshasítótábla automatikus változóban.

A rögzített csoporton belül a ?<keyname> használatával egy elnevezett kulcs alatt tárolhatja a rögzített adatokat.

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 windowsos biztonsági naplóban tárolja a legújabb naplóbejegyzést. A megadott reguláris kifejezés kinyeri a felhasználónevet és a tartományt az üzenetből, és a kulcsok alatt tárolja őket:N a névhez és D 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ókért lásd: Csoportosítási szerkezetek a reguláris kifejezésekben.

Helyettesítések reguláris kifejezésekben

Ha a regex kifejezést használja a -replace operátorral, dinamikusan lecserélheti a szöveget az elfogott szöveget használva.

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

  • <input>: A keresendő karakterlánc
  • <original>: A bemeneti sztringben való kereséshez használt reguláris kifejezés
  • <substitute>: Regex helyettesítési kifejezés a bemeneti sztringben található egyezések helyére.

A <original> és <substitute> operandusokra a normál kifejezésmotor szabályai vonatkoznak, például a karakteres menekülésre vagy a helyettesítő kifejezésekre. A csereminta egy vagy több helyettesítésből és literális karakterekből állhat.

A rögzítési csoportokra a <substitute> karakterrel lehet hivatkozni a $ sztringben a csoportazonosító előtt.

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

  • Szám – A rögzített csoportok balról jobbra vannak számozva.

    'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$1.$2.$3@contoso.com'
    
    John.D.Smith@contoso.com
    
  • Név – A rögzítési csoportokra nevük szerint is lehet hivatkozni.

    '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 $ karakter a sztringkibővítés során használatos, literál sztringeket kell használnia helyettesítéssel, vagy escape-elnie kell a $ karaktert, ha dupla idézőjelet használ.

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

Továbbá, ha a $ literális karakterként szeretné használni, használja a $$ a normál feloldó karakterek helyett. Dupla idézőjelek használata esetén továbbra is elkerülheti a $ összes példányát a helytelen helyettesítés elkerülése érdekében.

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

A helyettesítő kifejezésekkel kapcsolatos részletes információkért lásd A reguláris kifejezések helyettesítései.

Megjegyzések normál kifejezésekben

A reguláris kifejezések nagyon összetettek és nehezen olvashatók. Megjegyzésekkel érthetőbbé teheti őket. A normál kifejezésekben kétféle megjegyzés engedélyezett.

  • Beágyazott megjegyzés ((?#))
  • Sorvégi megjegyzés (#)

További információ: Reguláris kifejezés megjegyzéseiabout_Commentsszakasza.

Lásd még