Sdílet prostřednictvím


about_Regular_Expressions

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.

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 switch použ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.com
    
  • Podle 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.

Viz také