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-String
použ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
,-creplace
nebo-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 $Matches
automatickou 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.