快速入門
教學
工具和語言
範例
參考
書籍評論
正規表示式工具
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 .NET developers!

使用正規表示式與 Microsoft .NET

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 標準首先定義了此功能及其語法。

System.Text.RegularExpressions 總覽 (使用 VB.NET 語法)

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 的選用附加參數,就像建構函式一樣。

System.Text.RegularExpressions.Match 類別

如果您想要更多關於正規表示式相符的資訊,請呼叫 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).LengthMatchObj.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# 原文字串。在原文字串中,反斜線是一個普通字元。這允許你用你會在 RegexBuddyPowerGREP 等工具中寫的方式,或使用者會在你的應用程式中輸入的方式,來在你的 C# 程式碼中撰寫正規表示式。在使用 C# 原文字串時,符合反斜線的正規表示式寫成 @"\\"。反斜線在正規表示式中仍然是一個跳脫字元,所以你仍然需要將它加倍。但是加倍比加四倍好。若要符合一個字元,請使用原文字串 @"\w"

RegexOptions.ECMAScript

傳遞 RegexOptions.ECMAScriptRegex() 建構函式會改變特定正規表示式功能的行為,以遵循 ECMA-262 標準中規定的行為。此標準定義了 ECMAScript 語言,它更常稱為 JavaScript。下表比較了正規 .NET(沒有 ECMAScript 選項)和 ECMAScirpt 模式中的 .NET 之間的差異。為了參考,表格也比較了現代瀏覽器中的 JavaScript 在這些領域中的行為。

功能或語法正規 .NET.NET 在 ECMAScript 模式JavaScript
RegexOptions.FreeSpacing支援僅透過 (?x)不支援
RegexOptions.SingleLine支援僅透過 (?s)不支援
RegexOptions.ExplicitCapture支援僅透過 (?n)不支援
沒有形成正規表示式標記的跳脫字母或底線錯誤文字字母或底線
不是有效反向參照的跳脫數字錯誤八進位跳脫或文字 8 或 9
沒有形成有效反向參照的跳脫雙位數字錯誤單一數字反向參照和文字數字,如果單一數字反向參照有效;否則單一或雙位數字八進位跳脫和/或文字 8 和 9
反向參照到非參與群組無法符合零長度符合
前向參照支援錯誤零長度符合
反向參照到群組 0無法符合零長度符合語法上不可能
\sUnicodeASCIIUnicode
\dUnicodeASCII
\wUnicodeASCII
\bUnicodeASCII

儘管 RegexOptions.ECMAScript 讓 .NET regex 引擎更接近 JavaScript,但 .NET regex 風格和 JavaScript regex 風格之間仍然存在顯著差異。在伺服器上使用 ASP.NET 和在用戶端上使用 JavaScript 建立網頁時,即使設定 RegexOptions.ECMAScript,也不能假設相同的 regex 在用戶端和伺服器端都能以相同的方式運作。下表列出了 .NET 和 JavaScript 之間較重要的差異。RegexOptions.ECMAScript 對於這些差異沒有任何影響。

此表格也比較了 JavaScript 的 XRegExp 函式庫。您可以使用這個函式庫讓 JavaScript 的 regex 風格更接近 .NET。

功能或語法.NETXRegExpJavaScript
[^\n][^\n\r\u2028\u2029]
多行模式中的錨點僅將 \n 視為換行符號\n\r\u2028\u2029 視為換行符號
$(不含多行模式)與字串最尾端相符最後換行符號之前 和字串最尾端相符
永久的字串開頭和結尾錨點支援不支援
空的字元類別語法上不可能無法符合
後向參照不受限制地支援自 ECMAScript 2018 起支援(不受限制)
模式修改器任意位置僅在 regex 開頭不支援
註解支援不支援
Unicode 屬性類別和區塊不支援
命名擷取和反向參照支援不支援
平衡群組支援不支援
條件支援不支援

延伸讀物

Mastering Regular Expressions這本 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 |