Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Krótki opis
Opisuje wyrażenia regularne w programie PowerShell.
Długi opis
Notatka
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 kompletne informacje, zapoznaj się z Język Wyrażeń Regularnych — Szybki Przewodnik.
Wyrażenie regularne jest wzorcem używanym do dopasowywania tekstu. Może składać się z znaków dosłownych, operatorów i innych konstrukcji. Program PowerShell używa aparatu wyrażeń regularnych platformy .NET.
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.
- Wybierz-String
- operatory -match i -replace
- -split, operator
- instrukcja switch z opcją -regex
Wyrażenia regularne programu PowerShell są domyślnie niewrażliwe na wielkość liter. Każda z powyższych metod ma inny sposób wymuszania uwzględniania wielkości liter.
- W przypadku
Select-Stringużyj parametru CaseSensitive. - W przypadku operatorów korzystających z wyrażeń regularnych użyj wersji z uwzględnieniem wielkości liter:
-cmatch,-creplacelub-csplit - W przypadku instrukcji
switchużyj opcji-CaseSensitive
Literały znaków
Wyrażenie regularne może być literałem lub ciągiem. Wyrażenie powoduje, że silnik dokładnie dopasowuje się 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 precyzyjne.
Grupy znaków
[character group] pozwala dopasować dowolną liczbę znaków jednokrotnie, podczas gdy [^character group] dopasowuje tylko znaki, które NIE są 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], [0-9]liczbowe, 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 \d znaków pasuje do dowolnej cyfry dziesiętnej. Z drugiej strony \D pasuje do dowolnego znaku z wyjątkiem cyfr dziesiętnych.
# 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 \w pasuje do dowolnego znaku słowa [a-zA-Z_0-9]. Aby dopasować dowolny znak inny niż wyraz, użyj \W.
# This expression returns true.
# The pattern matches the first word character 'B'.
'Book' -match '\w'
Symbole wieloznaczne
Znak kropki (.) jest symbolem wieloznacznym w wyrażeniach regularnych. Dopasowuje się do dowolnego znaku z wyjątkiem znaku nowej linii (\n).
# This expression returns true.
# The pattern matches any 4 characters except the newline.
'a1\ ' -match '....'
Białe znaki
Możesz dopasować dowolny znak odstępu z klasą znaków \s. Można dopasować dowolny znak niebędący spacją za pomocą \S. Można dopasować znaki spacji literałowej za pomocą .
# 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 *, pasuje nawet 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 , przecinka są opcjonalne.
| Kwantyfikator | Opis |
|---|---|
{n} |
Dopasuj dokładnie n liczbę razy. |
{n,} |
Dopasuj co najmniej n liczbę razy. |
{n,m} |
Dopasowanie między n a 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 są ^ 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$'
Notatka
Podczas definiowania wyrażenia regularnego zawierającego kotwicę ($), wyrażenie należy ująć w pojedynczy cudzysłów ('). Jeśli używasz cudzysłowów podwójnych ("), program PowerShell interpretuje ciąg jako wyrażenie zmiennej z możliwością rozwinięcia.
W przypadku korzystania z zakotwiczeń w programie PowerShell należy zrozumieć różnicę między opcjami wyrażeń regularnych jednowierszowymi i wielowierszowymi.
-
wielowierszowy: tryb wielowierszowy wymusza
^i$, aby pasować do początku i końca każdego wiersza zamiast początku i końca ciągu wejściowego. -
jednoliniowy: tryb jednoliniowy traktuje ciąg wejściowy jako jednoliniowy.
Wymusza to 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ź 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 wykonać escapa tych znaków w swoich 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 może uniknić tekstu.
[regex]::Escape('3.\d{2,}')
3\.\\d\{2,}
Notatka
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 sekwencje ucieczki
Istnieją również zastrzeżone znaki ucieczkowe, których można używać do dopasowywania specjalnych typów znaków.
Poniżej przedstawiono kilka najczęściej używanych sekwencji ucieczki:
| Sekwencja ucieczki | Opis |
|---|---|
\t |
Pasuje do tabulatora |
\n |
Dopasowuje się do nowej linii |
\r |
Pasuje do znaku powrotu karetki |
Grupy, przechwytywanie i podstawianie
Konstrukcje grupowania oddzielają ciąg wejściowy do podciągów, które można przechwycić lub zignorować. Pogrupowane podciągi 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. Dowolny tekst dopasowany przez ujęte wyrażenie regularne jest przechwytywany. 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 $MatchesHashtable, aby pobrać przechwycony tekst.
Tekst odzwierciedlają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
Dane są przechowywane w kluczach całkowitoliczbowych liczbowych, które zwiększają się od lewej do prawej. Przechwycenie 1 zawiera cały tekst aż do nazwy użytkownika, a przechwycenie 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żny
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 zrzuty są przechowywane w kolejności rosnącej, od lewej do prawej.
Możesz także przypisać grupie przechwytywania nazwę . Ta nazwa staje się kluczem zmiennej automatycznej$Matches hashtable.
Wewnątrz grupy przechwytywania użyj ?<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 zabezpieczeń systemu Windows. Podane wyrażenie regularne wyodrębnia nazwę użytkownika i domenę z komunikatu i przechowuje je w kluczach: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 Konstrukcje grupowania w wyrażeniach regularnych.
Podstawianie w wyrażeniach regularnych
Użycie wyrażeń regularnych (regex) z operatorem -replace umożliwia dynamiczne zastępowanie tekstu za pomocą 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 regularne do zastąpienia pasujących elementów w ciągu wejściowym.
Operandy <original> i <substitute> podlegają regułom mechanizmu wyrażeń regularnych, takim jak znakowanie ucieczki lub wyrażenia zastępujące. Wzorzec zamiany może składać się z jednego lub więcej podstawień wraz z dosłownymi znakami.
Do grup przechwyconych można się odwoływać w ciągu znaków <substitute>, używając znaku $ przed identyfikatorem grupy.
Dwa sposoby odwoływania się do grup przechwytywania to przez liczba oraz przez nazwa.
Według liczba — grupy przechwytywania są numerowane od lewej do prawej.
'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$1.$2.$3@contoso.com'John.D.Smith@contoso.comWedług nazwa — 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 znakowych z podstawianiem lub unikać 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 użyć $ jako dosłownego znaku, użyj $$ zamiast standardowych znaków specjalnych. W przypadku używania 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 odnośnie wyrażeń podstawienia, zobacz Podstawienia w wyrażeniach regularnych.
Komentarze w wyrażeniach regularnych
Wyrażenia regularne mogą być bardzo złożone i trudne do odczytania. Możesz użyć komentarzy, aby były bardziej zrozumiałe. Istnieją dwa typy komentarzy dozwolonych w wyrażeniach regularnych.
- Komentarz wbudowany (
(?#)) - Komentarz końca wiersza (
#)
Aby uzyskać więcej informacji, zobacz sekcję komentarzy wyrażenia regularnego w dokumencie about_Comments.