Udostępnij za pośrednictwem


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, -csplitlub -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 $Matcheshashtable .

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.

Zobacz też