about_Regular_Expressions

Krátký popis

Popisuje regulární výrazy v PowerShellu.

Dlouhý popis

Poznámka

Tento článek vám ukáže syntaxi a metody pro používání regulárních výrazů v PowerShellu, ne všechny syntaxe. Podrobnější referenční informace najdete v tématu Jazyk regulárních výrazů – stručný přehled.

Regulární výraz je vzor, který se používá ke shodě s textem. Může se skládají z literálových znaků, operátorů a dalších konstruktorů.

Tento článek ukazuje syntaxi regulárních výrazů v PowerShellu. PowerShell obsahuje několik operátorů a rutin, které používají regulární výrazy. Další informace o jejich syntaxi a použití najdete na následujících odkazech.

Regulární výrazy PowerShellu ve výchozím nastavení nerozlišují malá a velká písmena. Každá výše uvedená metoda má jiný způsob, jak vynutit citlivost malých a malých písmen.

  • Pro Select-Stringpoužití parametru CaseSensitive .
  • Pro operátory, které používají regulární výrazy, použijte verzi s rozlišováním velkých a malých písmen: -cmatch, -creplacenebo -csplit
  • switch Pro příkaz použijte -casesensitive možnost

Literály znaků

Regulární výraz může být literálový znak nebo řetězec. Výraz způsobí, že modul přesně odpovídá zadanému textu.

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

Třídy znaků

Zatímco literály znaků fungují, pokud znáte přesný vzor, třídy znaků umožňují být méně specifické.

Skupiny znaků

[character group] umožňuje shodovat libovolný počet znaků jednou, zatímco [^character group] odpovídá pouze znakům, které nejsou ve skupině.

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

Pokud seznam znaků, které se mají shodovat, obsahuje znak spojovníku (-), musí být na začátku nebo na konci seznamu, aby se odlišil od výrazu rozsahu znaků.

Rozsahy znaků

Vzor může být také rozsah znaků. Znaky mohou být abecední [A-Z], číselné [0-9]nebo dokonce ASCII [ -~] (všechny tisknutelné znaky).

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

Čísla

Třída \d znaků bude odpovídat libovolné desetinné číslici. Naopak se bude shodovat s libovolnou číslicí, \D která není desetinná.

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

Znaky aplikace Word

Třída \w znaků bude odpovídat libovolnému znaku [a-zA-Z_0-9]slova . Chcete-li spárovat libovolný neslovný znak, použijte \W.

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

Zástupné znaky

Tečka (.) je zástupný znak v regulárních výrazech. Bude odpovídat libovolnému znaku kromě nového řádku (\n).

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

Prázdné znaky

Prázdné znaky se shodují pomocí \s třídy znaků. Libovolný znak bez prázdných znaků se shoduje s použitím \Sznaku . Znaky ' ' literálových mezer lze použít také.

# This expression returns true.
# The pattern uses both methods to match the space.
' - ' -match '\s- '

Kvantifikátory

Kvantifikátory řídí, kolik instancí jednotlivých prvků by mělo být ve vstupním řetězci.

V PowerShellu je k dispozici několik kvantifikátorů:

Kvantifikátor Description
* Nula nebo vícekrát.
+ Jednou nebo vícekrát.
? Nula nebo jednou.
{n,m} Alespoň n, ale ne vícekrát m .

Hvězdička (*) odpovídá předchozímu prvku nula nebo vícekrát. Výsledkem je, že i vstupní řetězec bez elementu by byl shoda.

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

Znaménko plus (+) odpovídá předchozímu prvku jednou nebo vícekrát.

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

Otazník ? odpovídá předchozímu prvku nula nebo jednou. Podobně jako hvězdička *se bude dokonce shodovat s řetězci, ve kterých chybí prvek.

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

Kvantifikátor {n, m} lze použít několik různých způsobů, jak povolit podrobnou kontrolu nad kvantifikátorem. Druhý prvek m a čárka , jsou volitelné.

Kvantifikátor Description
{n} n Přesně se shoduje s počtem opakování.
{n,} Porovná alespoň n početkrát.
{n,m} Shoda mezi n a m počtem časů.
# This returns true if it matches any phone number.
'111-222-3333' -match '\d{3}-\d{3}-\d{4}'

Kotvy

Ukotvení umožňuje způsobit úspěšné nebo neúspěšné shody na základě pozice shody ve vstupním řetězci.

Dvě běžně používané kotvy jsou ^ a $. Stříšku ^ odpovídá začátku řetězce, který $odpovídá konci řetězce. Ukotvení umožňuje spárovat text na určité pozici a zároveň zahodit nežádoucí znaky.

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

Poznámka

Při definování regulárního výrazu obsahujícího $ ukotvení nezapomeňte výraz uzavřít pomocí jednoduchých uvozovek (') místo dvojitých uvozovek (") nebo PowerShellu výraz rozbalí jako proměnnou.

Při použití ukotvení v PowerShellu byste měli porozumět rozdílu mezi možnostmi regulárního výrazu Singleline a Multiline .

  • Víceřádkový režim: Víceřádkový režim vynutí ^ a $ porovná začátek každého řádku místo začátku a konce vstupního řetězce.
  • Singleline: Režim singleline zpracovává vstupní řetězec jako SingleLine. Vynutí, aby znak odpovídal každému . znaku (včetně nových čar), místo aby odpovídal každému znaku KROMĚ nového řádku \n.

Další informace o těchto možnostech a jejich použití najdete v rychlém přehledu jazyka regulárních výrazů.

Uvozovací znaky

Zpětné lomítko (\) slouží k řídicím znakům, takže je modul regulárních výrazů ne parsuje.

Jsou vyhrazeny následující znaky: []().\^$|?*+{}.

Tyto znaky budete muset utéct do vzorů, aby se shodovaly ve vstupních řetězcích.

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

Existuje statická metoda třídy regex, která může řídicí text za vás.

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

Poznámka

Tím se uchytnou všechny rezervované znaky regulárního výrazu, včetně existujících zpětných lomítek použitých ve třídách znaků. Nezapomeňte ho použít jenom v části vašeho vzoru, kterou potřebujete utéct.

Jiné řídicí znaky

K dispozici jsou také vyhrazené řídicí znaky, které můžete použít k porovnání speciálních typů znaků.

Následuje několik běžně používaných řídicích znaků:

Řídicí znak Description
\t Odpovídá kartě
\n Odpovídá novému spojnice.
\r Odpovídá návratu na začátek řádku.

Skupiny, zachytávání a nahrazení

Seskupování konstruktorů odděluje vstupní řetězec do podřetězců, které lze zachytit nebo ignorovat. Seskupené podřetězce se nazývají dílčí výrazy. Ve výchozím nastavení jsou dílčí výrazy zachycené ve číslovaných skupinách, i když jim můžete přiřadit i názvy.

Konstruktor seskupení je regulární výraz obklopený závorky. Zachytí se jakýkoli text, který odpovídá uzavřenému regulárnímu výrazu. Následující příklad rozdělí vstupní text do dvou zachytávání skupin.

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

$Matches K načtení zachyceného textu použijte automatickou proměnnou Hashtable. Text představující celou shodu je uložen na klíči 0. Je důležité si uvědomit, že $Matches hashovatelná tabulka obsahuje pouze první výskyt jakéhokoli odpovídajícího vzoru.

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

Zachytávání se ukládají do číselných celočíselných klíčů, které se zvyšují zleva doprava. Capture 1 obsahuje celý text, dokud uživatelské jméno neobsahuje 2 jenom uživatelské jméno.

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

Důležité

Klíč 0 je celé číslo. K přístupu k uložené hodnotě můžete použít libovolnou metodu hashtable .

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

PS> $Matches[0]
Dog

PS> $Matches.Item(0)
Dog

PS> $Matches.0
Dog

Pojmenované snímky

Ve výchozím nastavení se zachytávání ukládají ve vzestupném číselném pořadí zleva doprava. Můžete také přiřadit název k zachytávací skupině. Tento název se stane klíčem pro $Matches automatickou proměnnou hashovací tabulky.

Uvnitř zachytávání skupiny můžete ukládat ?<keyname> zachycená data pod pojmenovaným klíčem.

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

Následující příklad ukládá nejnovější položku protokolu do protokolu Zabezpečení Windows. Zadaný regulární výraz extrahuje uživatelské jméno a doménu ze zprávy a uloží je pod klíči:N pro název a D pro doménu.

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

Další informace naleznete v tématu Seskupení konstruktorů v regulárních výrazech.

Nahrazení v regulárních výrazech

Použití regulárních výrazů s operátorem -replace umožňuje dynamicky nahradit text pomocí zachyceného textu.

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

  • <input>: Řetězec, který se má prohledávat
  • <original>: Regulární výraz použitý k hledání vstupního řetězce
  • <substitute>: Výraz nahrazení regulárního výrazu, který nahradí shody nalezené ve vstupním řetězci.

Poznámka

Operandy <original> a <substitute> operandy podléhají pravidlům modulu regulárních výrazů, jako je například uvozování znaků.

Na zachytávání skupin lze odkazovat v řetězci <substitute> . Nahrazení se provádí pomocí znaku $ před identifikátorem skupiny.

Dva způsoby, jak odkazovat na zachytávání skupin, jsou podle čísla a podle názvu.

  • Podle čísla – Zachytávání skupin se číslová zleva doprava.

    'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$1.$2.$3@contoso.com'
    
    John.D.Smith@contoso.com
    
  • Podle názvu – Zachytávání skupin lze odkazovat také podle názvu.

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

Výraz $& představuje veškerý text, který odpovídá.

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

Upozornění

Vzhledem k tomu, že se $ znak používá v rozšíření řetězce, budete muset použít literální řetězce s nahrazením nebo řídicí znak $ při použití dvojitých uvozovek.

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

Pokud chcete mít $ znak literálu, použijte $$ místo normálních řídicích znaků místo normálních řídicích znaků. Při použití dvojitých uvozovek stále uvozovky uvozujte všechny výskyty $ , abyste se vyhnuli nesprávné náhradě.

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

Další informace naleznete v tématu Nahrazení v regulárních výrazech.

Viz také