about_Regular_Expressions

簡短描述

描述 PowerShell 中的正規表示式。

詳細描述

注意

本文將說明在PowerShell中使用正則表達式的語法和方法,而不會討論所有語法。 如需更完整的參考,請參閱 正則表達式語言 - 快速參考

正則表達式是用來比對文字的模式。 它可以由常值字元、運算元和其他建構組成。

本文示範 PowerShell 中的正則表示式語法。 PowerShell 有數個使用正則表達式的運算符和 Cmdlet。 您可以在下列連結中深入了解其語法和使用方式。

根據預設,PowerShell 正則表示式不區分大小寫。 上述每個方法都有不同的方法來強制區分大小寫。

  • 針對 Select-String,請使用 CaseSensitive 參數。
  • 對於使用正則表達式的運算符,請使用區分大小寫的版本: -cmatch-creplace-csplit
  • switch針對語句,請使用 -casesensitive 選項

字元常值

正則表達式可以是常值字元或字串。 表達式會使引擎完全符合指定的文字。

# This statement returns true because book contains the string "oo"
'book' -match 'oo'

字元類別

雖然字元常值可運作,但如果您知道確切的模式,字元類別可讓您較不明確。

字元群組

[character group] 可讓您一次比對任意數目的字元,而 [^character group] 只比對群組中的字元 NOT。

# This expression returns true if the pattern matches big, bog, or bug.
'big' -match 'b[iou]g'

如果要比對的字元清單包含連字元字元 (-),它必須位於清單的開頭或結尾,才能與字元範圍表達式區別。

字元範圍

模式也可以是字元範圍。 這些字元可以是字母 [A-Z]、數位 [0-9],或甚至 ASCII 為基礎的 [ -~] 字元(所有可列印的字元)。

# This expression returns true if the pattern matches any 2 digit number.
42 -match '[0-9][0-9]'

數字

\d字元類別會比對任何十進位數。 相反地, \D 會比對任何非十進位數。

# This expression returns true if it matches a server name.
# (Server-01 - Server-99).
'Server-01' -match 'Server-\d\d'

文字字元

\w字元類別會比對任何單字元 [a-zA-Z_0-9]。 若要比對任何非單字元,請使用 \W

# This expression returns true.
# The pattern matches the first word character 'B'.
'Book' -match '\w'

萬用字元

句號 (.) 是正則表示式中的通配符。 它會比對除換行符 (\n) 以外的任何字元。

# This expression returns true.
# The pattern matches any 4 characters except the newline.
'a1\ ' -match '....'

空格

您可以比對任何空白與 \s 字元類別。 您可以使用 比對任何非空格符。\S 您可以使用 比對 常值空格字元。

# 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- '

Quantifiers

數量值可控制輸入字串中每個元素的實例數目。

以下是 PowerShell 中可用的幾個數量值:

數量詞 描述
* 零次或多次。
+ 一或多次。
? 零或一次。
{n,m} 至少 n,但不超過 m 數次。

星號 (*) 會比對前一個專案零次或多次。 結果是,即使沒有 元素的輸入字串也會相符。

# This returns true for all account name strings even if the name is absent.
'ACCOUNT NAME:    Administrator' -match 'ACCOUNT NAME:\s*\w*'

加號 (+) 會比對前一個元素一或多次。

# This returns true if it matches any server name.
'DC-01' -match '[A-Z]+-\d\d'

問號 ? 會比對前一個專案零或一次。 如同星號 *,它甚至會比對元素不存在的字串。

# This returns true for any server name, even server names without dashes.
'SERVER01' -match '[A-Z]+-?\d\d'

數量 {n, m} 值可以使用數種不同的方法來允許對數量值進行細微控制。 第二個元素 m 和逗號 , 是選擇性的。

數量詞 描述
{n} n完全符合次數。
{n,} n至少比對次數。
{n,m} 比對和nm次數。
# This returns true if it matches any phone number.
'111-222-3333' -match '\d{3}-\d{3}-\d{4}'

錨點

錨點可讓您根據輸入字串內的相符位置,導致比對成功或失敗。

兩個常用的錨點是 ^$。 插入號 ^ 會比對字串的開頭,而 $符合字串結尾。 錨點可讓您在特定位置比對文字,同時捨棄不必要的字元。

# The pattern expects the string 'fish' to be the only thing on the line.
# This returns FALSE.
'fishing' -match '^fish$'

注意

定義包含錨點的 $ regex 時,請務必使用單引號 () 而非雙引號 ('") 或 PowerShell 將表示式展開為變數,以括住 regex。

在 PowerShell 中使用錨點時,您應該瞭解 Singleline 與 Multiline 正則表示式選項之間的差異

  • 多行:多行模式會 ^ 強制並 $ 比對每個LINE的開頭端,而不是輸入字串的開頭和結尾。
  • 單行:單行模式會將輸入字串視為 SingleLine。 它會強制 . 字元比對每個字元(包括換行符),而不是比對每一個字元,但換行 \n符除外。

若要深入瞭解這些選項及其使用方式,請流覽 正則表達式語言 - 快速參考

逸出字元

反斜杠 (\) 用來逸出字元,因此不會由正則表達式引擎剖析它們。

保留下列字元: []().\^$|?*+{}

您必須在模式中逸出這些字元,以符合輸入字串中的字元。

# 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,}'

regex 類別有靜態方法,可以為您逸出文字。

[regex]::escape('3.\d{2,}')
3\.\\d\{2,}

注意

這會逸出所有保留的正則表達式字元,包括字元類別中使用的現有反斜杠。 請務必只在您需要逸出的模式部分使用它。

其他字元逸出

您也可以使用保留字元逸出來比對特殊字元類型。

以下是一些常用的字元逸出:

字元逸出 描述
\t 比對索引標籤
\n 比對換行符
\r 符合歸位字元

群組、擷取和替代

群組建構會將輸入字串分隔成可以擷取或忽略的子字串。 群組子字串稱為 subexpressions。 根據預設,子表達式會在編號群組中擷取,不過您也可以將名稱指派給他們。

群組建構是以括弧括住的正則表達式。 擷取所封入正規表示式所比對的任何文字。 下列範例會將輸入文字分成兩個擷取群組。

'The last logged on user was CONTOSO\jsmith' -match '(.+was )(.+)'
True

$Matches使用Hashtable自動變數來擷取擷取的文字。 代表整個比對的文字會儲存在索引鍵 0。 請務必注意, $Matches 哈希表只包含任何相符模式的第一次出現。

$Matches.0
The last logged on user was CONTOSO\jsmith

擷取會儲存在從左至右的數值 整數 索引鍵中。 擷取 1 包含所有文字,直到使用者名稱為止,擷取 2 只包含用戶名稱。

$Matches
Name           Value
----           -----
2              CONTOSO\jsmith
1              The last logged on user was
0              The last logged on user was CONTOSO\jsmith

重要

索引 0 鍵是 Integer。 您可以使用任何 Hashtable 方法來存取儲存的值。

PS> 'Good Dog' -match 'Dog'
True

PS> $Matches[0]
Dog

PS> $Matches.Item(0)
Dog

PS> $Matches.0
Dog

具名擷取

根據預設,擷取會以遞增的數值順序儲存,從左至右。 您也可以將名稱指派給擷取群組。 此名稱會成為Hashtable自動變數上的$Matches索引鍵。

在擷取群組內,使用 ?<keyname> 將擷取的數據儲存在具名索引鍵底下。

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

下列範例會將最新的記錄項目儲存在 Windows 安全性Log中。 提供的正則表達式會從訊息擷取使用者名稱和網域,並將其儲存在 [名稱] 的 [N ] 底下,並 針對網域使用 D

$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....

如需詳細資訊,請參閱 正則表達式中的群組建構。

在規則運算式中執行替代

使用正則表達式 (regex) 搭配 -replace 運算符,可讓您使用擷取的文字動態取代文字。

<input> -replace <original>, <substitute>

  • <input>:要搜尋的字串
  • <original>:用來搜尋輸入字串的正則表達式
  • <substitute>:regex 替代運算式,用來取代輸入字串中找到的相符專案。

<original><substitute> 操作數受限於正則表達式引擎的規則,例如字元逸出或替代表達式。 取代模式可以包含一個或多個替代,以及常值字元。

擷取群組可以使用群組標識元之前的字元在字元串$<substitute>參考。

參考擷取群組的兩種方式是依 數位 和依 名稱

  • 依數位 - 擷取群組由左至右編號。

    'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$1.$2.$3@contoso.com'
    
    John.D.Smith@contoso.com
    
  • 名稱 - 擷取群組也可以依名稱參考。

    'CONTOSO\Administrator' -replace '\w+\\(?<user>\w+)', 'FABRIKAM\${user}'
    
    FABRIKAM\Administrator
    

表達式 $& 代表所有相符的文字。

'Gobble' -replace 'Gobble', '$& $&'
Gobble Gobble

警告

$由於字元用於字串展開中,因此您必須使用常值字串搭配替代,或使用$雙引號逸出字元。

'Hello World' -replace '(\w+) \w+', '$1 Universe'
"Hello World" -replace "(\w+) \w+", "`$1 Universe"
Hello Universe
Hello Universe

此外,如果您想要將 設為 $ 常值字元,請使用 $$ 而非一般逸出字元。 使用雙引號時,仍會逸出 的所有實例 $ ,以避免不正確的替代。

'5.72' -replace '(.+)', '$$$1'
"5.72" -replace "(.+)", "`$`$`$1"
$5.72
$5.72

如需替代表達式的詳細資訊,請參閱 正則表示式中的替代。

另請參閱