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 omówiono wszystkie składnie. 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-Stringprogramu 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ą \Spolecenia . 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ę pamiętaj, aby ująć wyrażenie w cudzysłów pojedynczych () 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 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-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ż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.

Zobacz też