about_Regular_Expressions
Krótki opis
Opisuje wyrażenia regularne w programie PowerShell.
Długi opis
Uwaga
W tym artykule przedstawiono składnię i metody używania wyrażeń regularnych w programie PowerShell. Nie obejmuje wszystkich możliwych wyrażeń. Aby uzyskać bardziej pełną dokumentację, zobacz Język wyrażeń regularnych — krótki przewodnik.
Wyrażenie regularne jest wzorcem używanym do dopasowywania tekstu. Może składać się z znaków literałów, operatorów i innych konstrukcji.
W tym artykule przedstawiono składnię wyrażeń regularnych w programie PowerShell. Program PowerShell ma kilka operatorów i poleceń cmdlet, które używają wyrażeń regularnych. Więcej informacji na temat ich składni i użycia można przeczytać na poniższych linkach.
Wyrażenia regularne programu PowerShell są domyślnie niewrażliwe na wielkość liter. Każda z powyższych metod ma inny sposób wymuszania poufności wielkości liter.
- W przypadku
Select-String
programu użyj parametru CaseSensitive . - W przypadku operatorów korzystających z wyrażeń regularnych użyj wersji z uwzględnieniem wielkości liter:
-cmatch
, lub-creplace
-csplit
- W przypadku instrukcji
switch
użyj-casesensitive
opcji
Literały znaków
Wyrażenie regularne może być znakiem literału lub ciągiem. Wyrażenie powoduje, że aparat dokładnie pasuje do określonego tekstu.
# This statement returns true because book contains the string "oo"
'book' -match 'oo'
Klasy znaków
Podczas gdy literały znaków działają, jeśli znasz dokładny wzorzec, klasy znaków pozwalają być mniej specyficzne.
Grupy znaków
[character group]
Pozwala dopasować dowolną liczbę znaków jeden raz, podczas gdy [^character group]
tylko pasuje do znaków NOT w grupie.
# This expression returns true if the pattern matches big, bog, or bug.
'big' -match 'b[iou]g'
Jeśli lista znaków do dopasowania zawiera znak łącznika (-
), musi znajdować się na początku lub na końcu listy, aby odróżnić ją od wyrażenia zakresu znaków.
Zakresy znaków
Wzorzec może być również zakresem znaków. Znaki mogą być alfabetyczne [A-Z]
, liczbowe [0-9]
, a nawet oparte na [ -~]
ASCII (wszystkie znaki drukowalne).
# This expression returns true if the pattern matches any 2 digit number.
42 -match '[0-9][0-9]'
Liczby
Klasa znaków będzie zgodna \d
z dowolną cyfrą dziesiętną. \D
Z drugiej strony będzie pasować do każdej cyfry innej niż dziesiętna.
# This expression returns true if it matches a server name.
# (Server-01 - Server-99).
'Server-01' -match 'Server-\d\d'
Znaki programu Word
Klasa znaków będzie zgodna \w
z dowolnym znakiem [a-zA-Z_0-9]
słowa . Aby dopasować dowolny znak inny niż wyraz, użyj polecenia \W
.
# This expression returns true.
# The pattern matches the first word character 'B'.
'Book' -match '\w'
Symbole wieloznaczne
Kropka (.
) jest symbolem wieloznacznym w wyrażeniach regularnych. Będzie pasuje do dowolnego znaku, z wyjątkiem nowego wiersza (\n
).
# This expression returns true.
# The pattern matches any 4 characters except the newline.
'a1\ ' -match '....'
Whitespace
Z klasą znaków można dopasować dowolny znak odstępu \s
. Możesz dopasować dowolny znak inny niż biały znak za pomocą \S
polecenia . Znak spacji literału można dopasować do
znaku .
# 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- '
Kwantyfikatory
Kwantyfikatory kontrolują liczbę wystąpień każdego elementu w ciągu wejściowym.
Poniżej przedstawiono kilka kwantyfikatorów dostępnych w programie PowerShell:
Kwantyfikator | opis |
---|---|
* |
Zero lub więcej razy. |
+ |
Co najmniej jeden raz. |
? |
Zero lub jeden raz. |
{n,m} |
Co najmniej n , ale nie więcej niż m razy. |
Gwiazdka (*
) pasuje do poprzedniego elementu zero lub więcej razy. Wynikiem jest to, że nawet ciąg wejściowy bez elementu będzie zgodny.
# This returns true for all account name strings even if the name is absent.
'ACCOUNT NAME: Administrator' -match 'ACCOUNT NAME:\s*\w*'
Znak plus (+
) pasuje do poprzedniego elementu co najmniej raz.
# This returns true if it matches any server name.
'DC-01' -match '[A-Z]+-\d\d'
Znak ?
zapytania pasuje do poprzedniego elementu zero lub jeden raz. Podobnie jak gwiazdka *
, będzie ona nawet pasować do ciągów, w których element jest nieobecny.
# This returns true for any server name, even server names without dashes.
'SERVER01' -match '[A-Z]+-?\d\d'
Kwantyfikator {n, m}
może służyć na kilka różnych sposobów, aby umożliwić szczegółową kontrolę nad kwantyfikatorem. Drugi element m
i przecinek ,
są opcjonalne.
Kwantyfikator | opis |
---|---|
{n} |
Dopasuj dokładnie n liczbę razy. |
{n,} |
Dopasuj co najmniej n liczbę razy. |
{n,m} |
Dopasowanie między n i m liczbą razy. |
# This returns true if it matches any phone number.
'111-222-3333' -match '\d{3}-\d{3}-\d{4}'
Kotwice
Kotwice umożliwiają pomyślne lub nieudane dopasowanie na podstawie pozycji dopasowań w ciągu wejściowym.
Dwa najczęściej używane kotwice to ^
i $
. Daszek ^
pasuje do początku ciągu i $
, który pasuje do końca ciągu. Kotwice umożliwiają dopasowanie tekstu w określonej pozycji, jednocześnie odrzucając niepożądane znaki.
# The pattern expects the string 'fish' to be the only thing on the line.
# This returns FALSE.
'fishing' -match '^fish$'
Uwaga
Podczas definiowania wyrażenia regularnego zawierającego kotwicę ($
) należy ująć regex w cudzysłów pojedynczych ('
). Jeśli używasz podwójnych cudzysłowów ("
), program PowerShell interpretuje ciąg jako wyrażenie zmiennej z możliwością rozszerzania.
W przypadku korzystania z kotwic w programie PowerShell należy zrozumieć różnicę między opcjami wyrażeń regularnych jednowierszowych i wielowierszowych .
- Wielowierszowy: tryb wielowierszowy wymusza
^
i$
pasuje do początku każdego wiersza zamiast początku i końca ciągu wejściowego. - Jednoliniowy: tryb jednoliniowy traktuje ciąg wejściowy jako pojedynczą linię.
.
Wymusza dopasowanie znaku do każdego znaku (w tym nowych linii) zamiast dopasowywania każdego znaku z wyjątkiem nowego wiersza\n
.
Aby dowiedzieć się więcej o tych opcjach i sposobie ich używania, odwiedź stronę Język wyrażeń regularnych — szybka dokumentacja.
Znaki ucieczki
Ukośnik odwrotny (\
) jest używany do ucieczki znaków, więc nie są analizowane przez aparat wyrażeń regularnych.
Zastrzeżone są następujące znaki: []().\^$|?*+{}
.
Aby dopasować je do ciągów wejściowych, należy użyć w swoich wzorcach ucieczki tych znaków.
# 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,}'
Istnieje statyczna metoda klasy wyrażeń regularnych, która może uniknić tekstu.
[regex]::escape('3.\d{2,}')
3\.\\d\{2,}
Uwaga
Spowoduje to ucieczkę wszystkich zarezerwowanych znaków wyrażeń regularnych, w tym istniejących ukośników odwrotnych używanych w klasach znaków. Pamiętaj, aby używać go tylko na części wzorca, który należy użyć do ucieczki.
Inne znaki ucieczki
Istnieją również zastrzeżone znaki ucieczki, których można używać do dopasowywania specjalnych typów znaków.
Poniżej przedstawiono kilka najczęściej używanych znaków ucieczki:
Ucieczka znaku | opis |
---|---|
\t |
Pasuje do karty |
\n |
Pasuje do nowego wiersza |
\r |
Pasuje do powrotu karetki |
Grupy, przechwytywanie i podstawienia
Konstrukcje grupowania oddzielają ciąg wejściowy do podciągów, które można przechwycić lub zignorować. Pogrupowane podciągy są nazywane podwyrażeniami. Domyślnie podwyrażenia są przechwytywane w grupach numerowanych, ale można również przypisywać do nich nazwy.
Konstrukcja grupowania jest wyrażeniem regularnym otoczonym nawiasami. Przechwytywany jest dowolny tekst dopasowany przez ujęte wyrażenie regularne. Poniższy przykład dzieli tekst wejściowy na dwie grupy przechwytywania.
'The last logged on user was CONTOSO\jsmith' -match '(.+was )(.+)'
True
Użyj zmiennej automatycznej skrótu $Matches
, aby pobrać przechwycony tekst.
Tekst reprezentujący całe dopasowanie jest przechowywany w kluczu 0
. Należy pamiętać, że tabela skrótów $Matches
zawiera tylko pierwsze wystąpienie dowolnego pasującego wzorca.
$Matches.0
The last logged on user was CONTOSO\jsmith
Przechwytywanie są przechowywane w kluczach liczbowych liczb całkowitych , które zwiększają się od lewej do prawej. Przechwytywanie 1
zawiera cały tekst, dopóki nazwa użytkownika nie zostanie przechwycona 2
, zawiera tylko nazwę użytkownika.
$Matches
Name Value
---- -----
2 CONTOSO\jsmith
1 The last logged on user was
0 The last logged on user was CONTOSO\jsmith
Ważne
Klucz 0
jest liczbą całkowitą. Aby uzyskać dostęp do przechowywanej wartości, możesz użyć dowolnej metody hashtable .
PS> 'Good Dog' -match 'Dog'
True
PS> $Matches[0]
Dog
PS> $Matches.Item(0)
Dog
PS> $Matches.0
Dog
Nazwane przechwytywanie
Domyślnie przechwytywanie są przechowywane w kolejności rosnącej, od lewej do prawej.
Możesz również przypisać nazwę do grupy przechwytywania. Ta nazwa staje się kluczem zmiennej automatycznej w tabeli skrótów $Matches
.
Wewnątrz grupy przechwytywania użyj metody ?<keyname>
do przechowywania przechwyconych danych pod nazwanym kluczem.
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
Poniższy przykład przechowuje najnowszy wpis dziennika w dzienniku Zabezpieczenia Windows. Podane wyrażenie regularne wyodrębnia nazwę użytkownika i domenę z komunikatu i przechowuje je pod kluczami:N jako nazwę i D dla domeny.
$log = (Get-EventLog -LogName Security -Newest 1 -InstanceId 4689).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....
Aby uzyskać więcej informacji, zobacz Grupowanie konstrukcji w wyrażeniach regularnych.
Podstawienia w wyrażeniach regularnych
Użycie wyrażeń regularnych (regex) z operatorem -replace
umożliwia dynamiczne zastępowanie tekstu przy użyciu przechwyconego tekstu.
<input> -replace <original>, <substitute>
<input>
: ciąg do wyszukania<original>
: wyrażenie regularne używane do wyszukiwania ciągu wejściowego<substitute>
: wyrażenie podstawienia wyrażeń regularnych w celu zastąpienia dopasowań znalezionych w ciągu wejściowym.
Argumenty <original>
i <substitute>
podlegają regułom aparatu wyrażeń regularnych, takich jak ucieczka znaków lub wyrażenia podstawienia. Wzorzec zamieniania może składać się z co najmniej jednego podstawienia oraz znaków literału.
Grupy przechwytywania mogą być przywoływane w <substitute>
ciągu przy użyciu $
znaku przed identyfikatorem grupy.
Dwa sposoby odwoływania się do grup przechwytywania to liczba i nazwa.
Według liczby — grupy przechwytywania są numerowane od lewej do prawej.
'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$1.$2.$3@contoso.com'
John.D.Smith@contoso.com
Według nazwy — grupy przechwytywania mogą być również przywoływane według nazwy.
'CONTOSO\Administrator' -replace '\w+\\(?<user>\w+)', 'FABRIKAM\${user}'
FABRIKAM\Administrator
Wyrażenie $&
reprezentuje cały dopasowany tekst.
'Gobble' -replace 'Gobble', '$& $&'
Gobble Gobble
Ostrzeżenie
Ponieważ znak jest używany w rozszerzaniu $
ciągu, należy użyć ciągów literałów z podstawieniem lub uciec $
od znaku podczas używania podwójnych cudzysłowów.
'Hello World' -replace '(\w+) \w+', '$1 Universe'
"Hello World" -replace "(\w+) \w+", "`$1 Universe"
Hello Universe
Hello Universe
Ponadto, jeśli chcesz mieć $
znak literału jako literał, użyj $$
zamiast normalnych znaków ucieczki. W przypadku używania podwójnych cudzysłowów nadal należy unikać wszystkich wystąpień, aby uniknąć nieprawidłowego $
podstawienia.
'5.72' -replace '(.+)', '$$$1'
"5.72" -replace "(.+)", "`$`$`$1"
$5.72
$5.72
Aby uzyskać szczegółowe informacje na temat wyrażeń podstawienia, zobacz Podstawianie w wyrażeniach regularnych.