正規表示式工具 |
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 和部落格 |
Microsoft .NET,您可以使用任何 .NET 程式語言,例如 C# (C sharp) 或 Visual Basic.NET,它對正規表示式有強大的支援。.NET 的正規表示式風味功能非常豐富。唯一值得注意的遺漏功能是 所有格量詞 和 子常式呼叫。
在 .NET Framework 版本 2.0 到 4.8 中支援的正規表示式風味沒有差異。此風味與任何版本的 .NET Core 支援的風味也沒有差異。這包括最初的 .NET Core 1.0.0 和最新的 .NET 5.0。
.NET Framework 1.x 中的正規表示式風味與後續版本相比有一些差異。.NET Framework 2.0 修復了一些錯誤。 Unicode 類別 \p{Pi} 和 \p{Pf} 不再反轉。Unicode 區塊 名稱中帶有連字號的現在可以正確處理。.NET 2.0 中新增了一項功能:字元類別減法。它的運作方式與 XML Schema 正規表示式 中完全相同。XML Schema 標準首先定義了此功能及其語法。
regex 類別位於命名空間 System.Text.RegularExpressions 中。若要讓它們可用,請在原始碼開頭放置 Imports System.Text.RegularExpressions。
Regex 類別是您用來編譯正規表示式的類別。為了效率,正規表示式會編譯成內部格式。如果您計畫重複使用相同的正規表示式,請如下建構 Regex 物件:Dim RegexObj as Regex = New Regex("regularexpression")。然後您可以呼叫 RegexObj.IsMatch("subject") 來檢查正規表示式是否與主旨字串相符。Regex 允許一個 RegexOptions 類型的第二個參數。您可以指定 RegexOptions.IgnoreCase 作為最後一個參數,以讓正規表示式不區分大小寫。其他選項包括 IgnorePatternWhitespace,它會讓正規表示式自由間隔,RegexOptions.Singleline,它會讓點符號與換行符號相符,RegexOptions.Multiline,它會讓插入符號和美元符號與主旨字串中的嵌入換行符號相符,以及 RegexOptions.ExplicitCapture,它會將所有未命名群組轉換為非擷取群組。
呼叫 RegexObj.Replace("subject", "replacement") 以使用正規表示式對主旨字串執行搜尋並取代,將所有符合項取代為取代字串。在取代字串中,您可以使用 $& 將整個正規表示式符合項插入取代文字中。您可以使用 $1、$2、$3 等將擷取括號之間符合的文字插入取代文字中。使用 $$ 將單一美元符號插入取代文字中。若要取代為第一個反向參考緊接在數字 9 之後,請使用 ${1}9。如果您輸入 $19,且反向參考少於 19 個,則 $19 會被解釋為文字,並以這種形式出現在結果字串中。若要插入命名擷取群組的文字,請使用 ${name}。不當使用 $ 符號可能會產生不理想的結果字串,但絕不會導致引發例外狀況。
RegexObj.Split("Subject") 會沿著正規表示式符合項拆分主旨字串,傳回字串陣列。陣列包含正規表示式符合項之間的文字。如果正規表示式包含擷取括號,則由它們符合的文字也會包含在陣列中。如果您希望陣列包含整個正規表示式符合項,請在建立 RegexObj 的實例時,在整個正規表示式周圍加上括號。
Regex 類別也包含數個靜態方法,讓您可以在不建立 Regex 物件的狀況下使用正規表示式。這會減少您必須撰寫的程式碼量,而且如果只使用一次或很少重複使用相同的正規表示式,這會很合適。請注意,Regex 類別中大量使用成員重載。所有靜態方法都與其他非靜態方法具有相同的名稱 (但參數清單不同)。
Regex.IsMatch("subject", "regex") 檢查正規表示式是否與主旨字串相符。 Regex.Replace("subject", "regex", "replacement") 執行搜尋並取代。 Regex.Split("subject", "regex") 將主旨字串分割成如上所述的字串陣列。所有這些方法都接受類型為 RegexOptions 的選用附加參數,就像建構函式一樣。
如果您想要更多關於正規表示式相符的資訊,請呼叫 Regex.Match() 來建構 Match 物件。如果您已實例化 Regex 物件,請使用 Dim MatchObj as Match = RegexObj.Match("subject")。如果不是,請使用靜態版本:Dim MatchObj as Match = Regex.Match("subject", "regex")。
無論哪種方式,您都將取得類別 Match 的一個物件,其中包含關於主旨字串中第一個正規表示式相符的詳細資料。 MatchObj.Success 指示實際上是否有相符。如果有的話,請使用 MatchObj.Value 取得相符的內容,MatchObj.Length 取得相符的長度,以及 MatchObj.Index 取得主旨字串中相符的開頭。相符的開頭是以 0 為基礎,因此它實際上計算主旨字串中在相符左邊的字元數。
如果正規表示式包含 擷取括號,請使用 MatchObj.Groups 集合。 MatchObj.Groups.Count 指示擷取括號的數量。數量包含第 0 群組,也就是整個正規表示式相符。 MatchObj.Groups(3).Value 取得由第三對括號相符的文字。 MatchObj.Groups(3).Length 和 MatchObj.Groups(3).Index 取得由群組相符的文字長度,以及它在主旨字串中的索引,相對於主旨字串的開頭。 MatchObj.Groups("name") 取得 命名群組 “name” 的詳細資料。
若要在同一個主旨字串中尋找正規表示式的下一個相符,請呼叫 MatchObj.NextMatch(),它會傳回一個新的 Match 物件,其中包含第二次相符嘗試的結果。您可以繼續呼叫 MatchObj.NextMatch(),直到 MatchObj.Success 為 False。
請注意,在呼叫 RegexObj.Match() 之後,產生的 Match 物件會獨立於 RegexObj。這表示您可以同時處理由同一個 Regex 物件建立的幾個 Match 物件。
在 C# 字面字串中,以及在 C++ 和許多其他 .NET 語言中,反斜線是一個跳脫字元。字面字串 "\\" 是單一反斜線。在正規表示式中,反斜線也是一個跳脫字元。正規表示式 \\ 相符單一反斜線。這個正規表示式作為 C# 字串,會變成 "\\\\"。沒錯:4 個反斜線相符一個反斜線。
正規表示式 \w 符合一個字元。作為一個 C# 字串,這會寫成 "\\w"。
為了讓你的程式碼更易於閱讀,你應該使用 C# 原文字串。在原文字串中,反斜線是一個普通字元。這允許你用你會在 RegexBuddy 或 PowerGREP 等工具中寫的方式,或使用者會在你的應用程式中輸入的方式,來在你的 C# 程式碼中撰寫正規表示式。在使用 C# 原文字串時,符合反斜線的正規表示式寫成 @"\\"。反斜線在正規表示式中仍然是一個跳脫字元,所以你仍然需要將它加倍。但是加倍比加四倍好。若要符合一個字元,請使用原文字串 @"\w"。
傳遞 RegexOptions.ECMAScript 給 Regex() 建構函式會改變特定正規表示式功能的行為,以遵循 ECMA-262 標準中規定的行為。此標準定義了 ECMAScript 語言,它更常稱為 JavaScript。下表比較了正規 .NET(沒有 ECMAScript 選項)和 ECMAScirpt 模式中的 .NET 之間的差異。為了參考,表格也比較了現代瀏覽器中的 JavaScript 在這些領域中的行為。
功能或語法 | 正規 .NET | .NET 在 ECMAScript 模式 | JavaScript |
---|---|---|---|
RegexOptions.FreeSpacing | 支援 | 僅透過 | 不支援 |
RegexOptions.SingleLine | 支援 | 僅透過 | 不支援 |
RegexOptions.ExplicitCapture | 支援 | 僅透過 | 不支援 |
沒有形成正規表示式標記的跳脫字母或底線 | 錯誤 | 文字字母或底線 | |
不是有效反向參照的跳脫數字 | 錯誤 | 八進位跳脫或文字 8 或 9 | |
沒有形成有效反向參照的跳脫雙位數字 | 錯誤 | 單一數字反向參照和文字數字,如果單一數字反向參照有效;否則單一或雙位數字八進位跳脫和/或文字 8 和 9 | |
反向參照到非參與群組 | 無法符合 | 零長度符合 | |
前向參照 | 支援 | 錯誤 | 零長度符合 |
反向參照到群組 0 | 無法符合 | 零長度符合 | 語法上不可能 |
\s | Unicode | ASCII | Unicode |
\d | Unicode | ASCII | |
\w | Unicode | ASCII | |
\b | Unicode | ASCII |
儘管 RegexOptions.ECMAScript 讓 .NET regex 引擎更接近 JavaScript,但 .NET regex 風格和 JavaScript regex 風格之間仍然存在顯著差異。在伺服器上使用 ASP.NET 和在用戶端上使用 JavaScript 建立網頁時,即使設定 RegexOptions.ECMAScript,也不能假設相同的 regex 在用戶端和伺服器端都能以相同的方式運作。下表列出了 .NET 和 JavaScript 之間較重要的差異。RegexOptions.ECMAScript 對於這些差異沒有任何影響。
此表格也比較了 JavaScript 的 XRegExp 函式庫。您可以使用這個函式庫讓 JavaScript 的 regex 風格更接近 .NET。
功能或語法 | .NET | XRegExp | JavaScript |
---|---|---|---|
點 | [^\n] | [^\n\r\u2028\u2029] | |
多行模式中的錨點 | 僅將 \n 視為換行符號 | 將 \n、\r、\u2028 和 \u2029 視為換行符號 | |
$(不含多行模式) | 與字串最尾端相符 | 與 最後換行符號之前 和字串最尾端相符 | |
永久的字串開頭和結尾錨點 | 支援 | 不支援 | |
空的字元類別 | 語法上不可能 | 無法符合 | |
後向參照 | 不受限制地支援 | 自 ECMAScript 2018 起支援(不受限制) | |
模式修改器 | 任意位置 | 僅在 regex 開頭 | 不支援 |
註解 | 支援 | 不支援 | |
Unicode 屬性 | 類別和區塊 | 不支援 | |
命名擷取和反向參照 | 支援 | 不支援 | |
平衡群組 | 支援 | 不支援 | |
條件 | 支援 | 不支援 |
這本 Mastering Regular Expressions 不僅說明了您想了解和不想了解的關於正規表示式的一切,包括 .NET 獨有的 regex 功能。它有一個關於 .NET 的 System.Text.RegularExpressions 命名空間的出色章節,說明各種 Regex 類別遠遠優於 Microsoft 的文件,並提供了大量的範例 VB.NET 範例程式碼和一些顯示更進階技術的 C# 程式碼。
我對 Mastering Regular Expressions 這本書的評論
| 快速入門 | 教學 | 工具和語言 | 範例 | 參考 | 書籍評論 |
| 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/dotnet.html
頁面最後更新時間:2021 年 8 月 24 日
網站最後更新時間:2024 年 3 月 15 日
版權所有 © 2003-2024 Jan Goyvaerts。保留所有權利。