共用方式為


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'

Word 字元

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

數量詞

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

以下是 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 時,請務必使用單引弧括住 regex () ' 而不是雙引號, () " 或 PowerShell 會將表達式展開為變數。

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

  • 多行:多行模式會強制 ^$ 比對每個LINE的開頭結尾,而不是輸入字串的開頭和結尾。
  • 單行:單行模式會將輸入字串視為 SingleLine。 它會強制 . 字元比對每個字元, (包括換行) ,而不是比對每一個字元 EXCEPT 換行符 \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,}

注意

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

其他字元逸出

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

以下是幾個常用的字元逸出:

字元逸出 Description
\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

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

另請參閱