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} |
比對和n m 次數。 |
# 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 中使用錨點時,您應該瞭解 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-EventLog -LogName Security -Newest 1 -InstanceId 4689).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
如需替代表達式的詳細資訊,請參閱 正則表示式中的替代。