Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Krátký popis
Popisuje regulární výrazy v PowerShellu.
Dlouhý popis
Poznámka
Tento článek ukazuje syntaxi a metody pro používání regulárních výrazů v PowerShellu. Nepokrývá všechny možné výrazy. Pro úplnější referenční informace si prohlédněte jazyk regulárních výrazů – stručná referenční příručka.
Regulární výraz je vzor, který se používá pro porovnání textu. Může se skládat z literálových znaků, operátorů a dalších konstrukcí. PowerShell používá modul regex .NET.
Tento článek ukazuje syntaxi regulárního výrazu 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.
- select-string
- operátory match a -replace
- – operátor rozdělení
- příkaz switch s možností -regex
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 vytvořit citlivost rozeznávání velikosti písmen.
- Pro
Select-Stringpoužijte parametr CaseSensitive. - U operátorů, 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 - Pro příkaz
switchpoužijte možnost-CaseSensitive.
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 [ -~] založené na 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ů odpovídá libovolné desítkové číslici. Naopak \D odpovídá libovolnému znaku kromě desítkových číslic.
# This expression returns true if it matches a server name.
# (Server-01 - Server-99).
'Server-01' -match 'Server-\d\d'
Znaky wordu
Třída znaků \w odpovídá libovolnému znaku slova [a-zA-Z_0-9]. 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. Odpovídá 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é místo
Libovolný bílý znak můžete spárovat s třídou znaků \s. Libovolný neprázdný znak můžete spárovat s \S. Literálové mezery lze shodovat s .
# 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- '
Kvantifikátory
Kvantifikátory řídí, kolik instancí každého prvku by mělo být ve vstupním řetězci.
V PowerShellu je k dispozici několik kvantifikátorů:
| Kvantifikátor | Popis |
|---|---|
* |
Nula nebo vícekrát. |
+ |
Jednou nebo vícekrát. |
? |
Nula nebo jednou. |
{n,m} |
Alespoň n, ale ne více než m krát. |
Hvězdička (*) odpovídá předchozímu prvku nula a vícekrát. Výsledkem je, že i vstupní řetězec bez prvku 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 jedenkrát. Stejně jako hvězdička *, dokonce odpovídá řetězcům, ve kterých element chybí.
# 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 | Popis |
|---|---|
{n} |
Shoda PŘESNĚ n krát. |
{n,} |
Najdi alespoň nkrát. |
{n,m} |
Shoda mezi n a m počtem opakování. |
# This returns true if it matches any phone number.
'111-222-3333' -match '\d{3}-\d{3}-\d{4}'
Kotvy
Kotvy vám umožňují ovlivnit úspěšnost shody na základě její pozice ve vstupním řetězci.
Dvě běžně používané kotvy jsou ^ a $. Stříška ^ odpovídá začátku řetězce a $odpovídá konci řetězce. Ukotvení umožňuje zarovnat 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 kotvu ($) byste měli regulární výraz uzavřít do jednoduchých uvozovek ('). Pokud použijete dvojité uvozovky ("), PowerShell interpretuje řetězec jako výraz rozšiřitelné proměnné.
Při použití ukotvení v PowerShellu byste měli pochopit rozdíl mezi jednořádkovým a možnostmi víceřádkového regulárních výrazů.
-
víceřádkové: Režim víceřádkového způsobí, že
^a$budou odpovídat začátku a konci každého řádku místo začátku a konce vstupního řetězce. -
Singleline: Režim SingleLine považuje vstupní řetězec za SingleLine.
Vynutí znak
., aby odpovídal každému znaku (včetně konců řádků), místo aby odpovídal každému znaku KROMĚ konce řádku\n.
Další informace o těchto možnostech a jejich použití najdete v jazyk regulárních výrazů – stručná referenční.
Znaky pro zapouzdření
Zpětné lomítko (\) se používá k escapování znaků, aby nebyly zpracovávány regulárním výrazovým systémem.
Jsou vyhrazeny následující znaky: [().\^$|?*+{.
Tyto znaky budete muset ve vzorech upravit, aby se shodovaly s řetězci vstupu.
# 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 utéct text za vás.
[regex]::Escape('3.\d{2,}')
3\.\\d\{2,}
Poznámka
Tím se odstraní 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 pouze v části vašeho vzoru, kterou potřebujete utéct.
Další únikové znaky
Existují také vyhrazené únikové sekvence, které můžete použít k odpovídání speciálního typu znaků.
Následuje několik běžně používaných znakových úniků:
| Escape znak | Popis |
|---|---|
\t |
Odpovídá záložce |
\n |
Odpovídá novému řádku. |
\r |
Odpovídá návratu vozíku. |
Skupiny, zachytávání a náhrady
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 zachyceny ve číslovaných skupinách, i když k nim můžete přiřadit i názvy.
Konstruktor seskupení je regulární výraz obklopený závorky. Zachytí se veškerý text odpovídající uzavřenému regulárnímu výrazu. Následující příklad rozdělí vstupní text do dvou zachycených skupin.
'The last logged on user was CONTOSO\jsmith' -match '(.+was )(.+)'
True
K načtení zachyceného textu použijte automatickou proměnnou Hashtable $Matches.
Text představující celou shodu je uložen v klíči 0. Je důležité si uvědomit, že $Matches hashtable obsahuje pouze první výskyt jakéhokoli odpovídajícího vzoru.
$Matches.0
The last logged on user was CONTOSO\jsmith
Záznamy se ukládají v číselném celé číslo klíči, které se zleva doprava zvyšují. Zachycení 1 obsahuje veškerý text až po uživatelské jméno, zatímco 2 obsahuje pouze 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. Pro přístup 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é zachytávače
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 skupině zachycení. Tento název se změní na klíč $Matcheshashtable automatické proměnné.
Uvnitř skupiny zachycení použijte ?<keyname> k ukládání zachycených dat 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í systému 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 Seskupování konstrukcí v regulárních výrazech.
Nahrazení v regulárních výrazech
Použití regulárních výrazů (regex) 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 prohledávání vstupního řetězce -
<substitute>: Výraz pro nahrazení regulárním výrazem, který nahradí shody nalezené ve vstupním řetězci.
Operandy <original> a <substitute> podléhají pravidlům modulu regulárních výrazů, jako jsou znakové odvozování nebo výrazy nahrazení. Vzor nahrazení se může skládat z jedné nebo více náhrad spolu s literálními znaky.
Skupiny zachycení lze odkazovat v řetězci <substitute> pomocí znaku $ před identifikátorem skupiny.
Dva způsoby, jak odkazovat na zachytávání skupin, jsou číslo a název.
Podle čísla – Záchytné skupiny jsou očíslovány zleva doprava.
'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$1.$2.$3@contoso.com'John.D.Smith@contoso.comPodle Name – Skupiny zachycení se dají odkazovat také podle názvu.
'CONTOSO\Administrator' -replace '\w+\\(?<user>\w+)', 'FABRIKAM\${user}'FABRIKAM\Administrator
Výraz $& představuje veškerý odpovídající text.
'Gobble' -replace 'Gobble', '$& $&'
Gobble Gobble
Varování
Vzhledem k tomu, že se znak $ používá v rozšiřování řetězců, budete muset použít doslovné řetězce s náhradou nebo použít uvození znaku $ 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 $ jako doslovný znak, použijte $$ místo běžných escape sekvencí. Při použití dvojitých uvozovek stále unikněte všechny instance $, abyste se vyhnuli nesprávnému nahrazení.
'5.72' -replace '(.+)', '$$$1'
"5.72" -replace "(.+)", "`$`$`$1"
$5.72
$5.72
Podrobné informace o výrazech nahrazení naleznete v tématu Nahrazení v regulárních výrazech.
Komentáře v regulárních výrazech
Regulární výrazy můžou být velmi složité a obtížně čitelné. Komentáře můžete použít k tomu, aby byly srozumitelnější. V regulárních výrazech jsou povolené dva typy komentářů.
- Vložený komentář (
(?#)) - Komentář na konci řádku (
#)
Pro další informace nahlédněte do sekce komentáře k regulárním výrazům v rámci about_Comments.