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. Podrobnější referenční informace najdete v jazyce regulárních výrazů – stručná referenční příručka.

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

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 vynutit citlivost malých a malých písmen.

  • Pro Select-Stringpoužití caseSensitive parametr.
  • 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 -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] pouze odpovídá 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 konci seznamu, aby se odlišil od výrazu rozsahu znaků.

Rozsahy znaků

Vzor může být také rozsah znaků. Znaky můžou 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é desítkové číslici. Naopak \D bude odpovídat libovolnému znaku kromě desetinný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 \w znaků bude odpovídat libovolnému znaku [a-zA-Z_0-9]slova . Chcete-li se shodovat s libovolným neslovým znakem, 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 '....'

Whitespace

Libovolný znak prázdného znaku \s můžete spárovat s třídou znaků. Můžete se shodovat s libovolným jiným než prázdným znakem .\S Literální mezery lze shodovat s literálovými znaky .

# 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ícekrát m .

Hvězdička (*) odpovídá předchozímu prvku nulakrát 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. Stejně jako hvězdička *se bude dokonce shodovat s řetězci, 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ěkolika různými způsoby, jak povolit podrobnou kontrolu nad kvantifikátorem. Druhý prvek m a čárka , jsou volitelné.

Kvantifikátor Popis
{n} n Přesně se shoduje s počtem opakování.
{n,} Porovná alespoň n početkrát.
{n,m} Porovná se 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}'

Záložky

Kotvy umožňují 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říška ^ odpovídá začátku řetězce a $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í ($ ) 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 porozumět rozdílu mezi možnostmi jednořádkového a víceřádkového regulárního výrazu.

  • Víceřádkové: Víceřádkový režim donutí ^ a $, aby sjednotily začátek a konec 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í, aby znak odpovídal každému . znaku (včetně nových spojnic), 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ů.

Znaky pro zapouzdření

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

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

Tyto znaky budete muset ve vzorech uvíznout, 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 utéct 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 pouze v části vašeho vzoru, kterou potřebujete utéct.

Řídicí znaky jiného znaku

Existují také vyhrazené řídicí znaky, které můžete použít ke shodě speciálních typů znaků.

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

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

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

$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ádá do číselných celočíselných klíčů, které se zleva doprava zvětší. Funkce Capture 1 obsahuje veškerý 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. 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é zachycení

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 zachytácí skupině. Tento název se stane klíčem pro $Matchesautomatickou proměnnou hashovací tabulky .

Uvnitř skupiny zachytávání slouží ?<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í 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í konstruktorů 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 nahrazení regulárního výrazu, který nahradí shody nalezené ve vstupním řetězci.

Operandy <original> a <substitute> operandy podléhají pravidlům modulu regulárních výrazů, jako jsou znakové eskapace nebo substituční výrazy. Vzor pro nahrazení se může skládat z jedné nebo několika substitucí 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 podle čísla a podle názvu.

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

    'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$1.$2.$3@contoso.com'
    
    John.D.Smith@contoso.com
    
  • Podle názvu – 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

Upozorňující

Vzhledem k tomu, že se $ znak používá v rozšíření řetězce, budete muset použít literály s nahrazením nebo uvozovat $ 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

Kromě toho, pokud chcete mít $ jako literální znak, použijte $$ místo normálních řídicích znaků. Při použití dvojitých uvozovek stále uvozovek neunikne všem instancím $ , aby nedocházelo k 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.

Viz také