快速入門
教學
工具和語言
範例
參考
書籍評論
正規表示式工具
grep
PowerGREP
RegexBuddy
RegexMagic
一般應用程式
EditPad Lite
EditPad Pro
語言和函式庫
Boost
Delphi
GNU (Linux)
Groovy
Java
JavaScript
.NET
PCRE (C/C++)
PCRE2 (C/C++)
Perl
PHP
POSIX
PowerShell
Python
R
Ruby
std::regex
Tcl
VBScript
Visual Basic 6
wxWidgets
XML Schema
Xojo
XQuery 和 XPath
XRegExp
資料庫
MySQL
Oracle
PostgreSQL
本網站的更多資訊
簡介
正規表示式快速入門
正規表示式教學
替換字串教學
應用程式和語言
正規表示式範例
正規表示式參考
替換字串參考
書籍評論
可列印 PDF
關於本網站
RSS Feed 和部落格
RegexBuddy—The best regex editor and tester for PowerShell developers!

PowerShell 中的正規表示式

PowerShell 是 Microsoft 的程式語言,主要設計用於系統管理。PowerShell 建立在 .NET 之上,因此 PowerShell 程式設計師也可以使用 .NET 出色的正規表示式支援

以下討論同樣適用於 Windows PowerShell 1.0 到 5.1、PowerShell Core 6 和 PowerShell 7。自 .NET 2.0 之後,.NET 或 .NET Core 中的正規表示式語法並未有任何變更。PowerShell 1.0 在 .NET 2.0 之後釋出。因此,所有版本的 PowerShell 都使用相同的正規表示式語法。Windows PowerShell 2.0 和 5.0 新增了一些功能,讓分割字串和呼叫其他 Regex() 建構函式變得更容易。除此之外,在使用正規表示式方面,所有 PowerShell 版本之間沒有任何差異。

PowerShell -Match 和 -Replace 營運子

使用 -match 營運子,您可以快速檢查正規表示式是否與字串的一部分相符。例如,'test' -match '\w' 會傳回 true,因為 \wtest 中的 t 相符。

作為副作用,-match 營運子會設定一個稱為 $matches 的特殊變數。這是一個關聯陣列,用於儲存整體正規表示式相符項和所有擷取群組相符項。$matches[0] 會提供您整體正規表示式相符項,$matches[1] 會提供第一個擷取群組,而 $matches['name'] 會提供由命名群組「name」相符的文字。

-replace 營運子使用正規表示式在字串中進行搜尋和取代。例如,'test' -replace '\w', '$&$&' 會傳回 'tteesstt'。正規表示式 \w 會相符一個字母。取代文字會使用 $& 兩次重新插入正規表示式相符項。必須指定取代文字參數,並且正規表示式和取代項必須以逗號分隔。如果您要將正規表示式相符項取代為空白,請傳遞一個空白字串作為取代項。

傳統上,正規表示式預設會區分大小寫。.NET 架構也是如此。不過,PowerShell 中並非如此。-match-replace 不區分大小寫,-imatch-ireplace 也是如此。對於區分大小寫的相符項,請使用 -cmatch-creplace。我建議您始終使用「i」或「c」前綴,以避免對大小寫敏感性感到困惑。

運算子不提供傳遞 .NET 的 RegexOptions 列舉選項的方法。請改用正規表示式中的模式修改器。例如 (?m)^test$ 等同於將 RegexOptions.MultiLine 傳遞給 Regex() 建構函式,並使用 ^test$。模式修改器優先於外部設定的正規表示式選項。-cmatch '(?i)test' 不分大小寫,而 -imatch '(?-i)test' 則區分大小寫。模式修改器會覆寫 -match 運算子的不區分大小寫偏好設定。

PowerShell -Split 運算子

PowerShell 2.0(隨 Windows 7 SP1 推出)新增了 -split 運算子。它允許您沿著正規表示式比對來分割字串。例如 $subject -split "\W+" 會沿著非字元字元來分割主旨字串,因此會傳回字串中所有字詞的陣列。

替換文字作為字面字串

-replace 運算子支援與 .NET 中的 Regex.Replace() 函式相同的替換文字佔位符。$& 是整體正規表示式比對,$1 是由第一個擷取群組比對的文字,而 ${name} 是由命名群組「name」比對的文字。

但在 PowerShell 中,有一個額外的注意事項:雙引號字串使用美元語法進行變數內插。變數內插會在 Regex.Replace() 函式(-replace 在內部使用)解析替換文字之前完成。與 Perl 不同,$1 在 PowerShell 中並非神奇變數。該語法僅在替換文字中有效。-replace 運算子也不會設定 $matches 變數。因此 'test' -replace '(\w)(\w)', "$2$1"(雙引號替換)會傳回空字串(假設您未在先前的 PowerShell 程式碼中設定變數 $1 和 $2)。由於變數內插,Replace() 函式永遠不會看到 $2$1。若要讓 Replace() 函式取代其佔位符,請使用 'test' -replace '(\w)(\w)', '$2$1'(單引號替換)或 'test' -replace '(\w)(\w)', "`$2`$1"(美元符號以反引號跳脫),以確保 $2$1 會以字面形式傳遞給 Regex.Replace()。

使用 System.Text.RegularExpressions.Regex 類別

若要使用 PowerShell 的所有 .NET 正規運算式處理功能,請透過實例化 System.Text.RegularExpressions.Regex 類別來建立正規運算式物件。如果您想要使用 Regex() 建構函式,它會將字串視為唯一參數,而正規運算式則會編譯,PowerShell 會提供一個便利的捷徑。 $regex = [regex] '\W+' 編譯正規運算式 \W+(與一個或多個非字元元匹配)並將結果儲存在變數 $regex 中。您現在可以在 $regex 物件上呼叫 Regex 類別的所有方法。

在 PowerShell 5.0 及更新版本中,您可以在類別名稱上呼叫另一個 Regex() 建構函式

using namespace System.Text.RegularExpressions
$regex = [Regex]::new('^test$', [RegexOptions]::MultiLine)

在舊版本的 PowerShell 中,您必須使用 PowerShell 的 new-object cmdlet。例如,若要設定 RegexOptions.MultiLine 旗標,您需要這行程式碼

$regex = new-object System.Text.RegularExpressions.Regex ('^test$',
         [System.Text.RegularExpressions.RegexOptions]::MultiLine)

在任何版本的 PowerShell 中,正規運算式內的 模式修改器 都可以提供更簡短的解決方案

$regex = [regex] '(?m)^test$'

模式修改器也可以與 -match-replace-split 營運子搭配使用。

| 快速入門 | 教學 | 工具和語言 | 範例 | 參考 | 書籍評論 |

| grep | PowerGREP | RegexBuddy | RegexMagic |

| EditPad Lite | EditPad Pro |

| Boost | Delphi | GNU (Linux) | Groovy | Java | JavaScript | .NET | PCRE (C/C++) | PCRE2 (C/C++) | Perl | PHP | POSIX | PowerShell | Python | R | Ruby | std::regex | Tcl | VBScript | Visual Basic 6 | wxWidgets | XML Schema | Xojo | XQuery 和 XPath | XRegExp |

| MySQL | Oracle | PostgreSQL |