正規表示式工具 |
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 和部落格 |
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 版本之間沒有任何差異。
使用 -match 營運子,您可以快速檢查正規表示式是否與字串的一部分相符。例如,'test' -match '\w' 會傳回 true,因為 \w 與 test 中的 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 列舉選項的方法。請改用正規表示式中的模式修改器。例如 ^test$ 等同於將 RegexOptions.MultiLine 傳遞給 Regex() 建構函式,並使用 ^test$。模式修改器優先於外部設定的正規表示式選項。-cmatch '(?i)test' 不分大小寫,而 -imatch '(?-i)test' 則區分大小寫。模式修改器會覆寫 -match 運算子的不區分大小寫偏好設定。
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()。
若要使用 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 |
頁面網址:https://regular-expressions.dev.org.tw/powershell.html
頁面最後更新時間:2021 年 11 月 5 日
網站最後更新時間:2024 年 3 月 15 日
版權所有 © 2003-2024 Jan Goyvaerts。保留所有權利。