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, a nie cała składnia. Aby uzyskać bardziej kompletną 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 uzyskać, klikając poniższe linki.
Wyrażenia regularne programu PowerShell są domyślnie niewrażliwe na wielkość liter. Każda metoda przedstawiona powyżej ma inny sposób wymuszania poufności wielkości liter.
Metoda | Ważność wielkości liter |
---|---|
Select-String |
użyj -CaseSensitive przełącznika |
switch Instrukcja |
-casesensitive użyj opcji |
Operatory | prefiks z prefiksem "c" (-cmatch , -csplit lub -creplace ) |
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]
dopasuje tylko znaki 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ć go od wyrażenia zakresu znaków.
Zakresy znaków
Wzorzec może być również zakresem znaków. Znaki mogą być alfabetyczne [A-Z]
, numeryczne [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ą. Z drugiej strony \D
wartość będzie zgodna z dowolną cyfrą inną niż dziesiętna.
# This expression returns true if it matches a server name.
# (Server-01 - Server-99).
'Server-01' -match 'Server-\d\d'
Word znaków
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 ona zgodna z dowolnym znakiem z wyjątkiem nowego wiersza (\n
).
# This expression returns true.
# The pattern matches any 4 characters except the newline.
'a1\ ' -match '....'
Białe znaki
Białe znaki są dopasowywane przy użyciu \s
klasy znaków. Każdy znak inny niż biały jest dopasowywany przy użyciu elementu \S
. Można również użyć znaków spacji ' '
literału.
# This expression returns true.
# The pattern uses both methods to match the space.
' - ' -match '\s- '
Kwantyfikatory
Kwantyfikatory określają, ile wystąpień każdego elementu powinno być obecnych 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 być używany 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 niepowodzenie dopasowania na podstawie pozycji dopasowań w ciągu wejściowym.
Dwa często 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, a jednocześnie odrzucanie niepożądanych znaków.
# 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ąć wyrażenia regularne przy użyciu apostrofów () zamiast cudzysłowów podwójnych ('
"
) lub program PowerShell rozszerzy wyrażenie jako zmienną.
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 pojedynczy wiersz.
.
Wymusza dopasowanie znaku do każdego znaku (w tym nowego wiersza) 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 — krótki przewodnik.
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ć ucieczki tych znaków we wzorcach.
# 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 umożliwia ucieczkę tekstu.
[regex]::escape('3.\d{2,}')
3\.\\d\{2,}
Uwaga
Spowoduje to ucieczkę wszystkich zastrzeżonych 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 w części wzorca, którą należy użyć do ucieczki.
Inne znaki ucieczki
Istnieją również zastrzeżone znaki ucieczki, których można użyć do dopasowywania typów znaków specjalnych.
Poniżej przedstawiono kilka często używanych znaków ucieczki:
Znak ucieczki | Opis |
---|---|
\t |
Pasuje do karty |
\n |
Pasuje do nowego wiersza |
\r |
Pasuje do powrotu karetki |
Grupy, przechwytywane i podstawienia
Konstrukcje grupowania oddzielają ciąg wejściowy do podciągów, które można przechwycić lub zignorować. Zgrupowane 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 $Matches
tabela skrótów zawiera tylko pierwsze wystąpienie dowolnego pasującego wzorca.
$Matches.0
The last logged on user was CONTOSO\jsmith
Przechwytywane są przechowywane w numerycznych kluczach 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 skrótu .
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 w zmiennej automatycznej $Matches
hashtable .
Wewnątrz grupy przechwytywania użyj polecenia ?<keyname>
do przechowywania przechwyconych danych w nazwanym kluczu.
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 dla nazwy i D dla domeny.
$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....
Aby uzyskać więcej informacji, zobacz Grupowanie konstrukcji w wyrażeniach regularnych.
Podstawienia w wyrażeniach regularnych
Używanie wyrażeń regularnych z operatorem -replace
umożliwia dynamiczne zastępowanie tekstu przy użyciu przechwyconego tekstu.
<input> -replace <original>, <substitute>
<input>
: ciąg do przeszukania<original>
: Wyrażenie regularne używane do wyszukiwania ciągu wejściowego<substitute>
: wyrażenie podstawienia wyrażenia regularnego w celu zastąpienia dopasowań znalezionych w ciągu wejściowym.
Uwaga
Argumenty <original>
i <substitute>
podlegają regułom aparatu wyrażeń regularnych, takich jak ucieczka znaków.
W ciągu można odwoływać się do grup przechwytywania <substitute>
. Podstawianie odbywa się przy użyciu $
znaku przed identyfikatorem grupy.
Dwa sposoby odwoływania się do grup przechwytywania są według liczby i nazwy.
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 — do przechwytywania Grupy można również odwoływać się 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 rozszerzeniu 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ć więcej informacji, zobacz Podstawianie w wyrażeniach regularnych.