分組構造描述了Regex的子運算式,通常用於捕獲輸入字串的子字串。下表描述了Regex分組構造。
分組構造 |
說明 |
( 子運算式 ) |
捕獲匹配的子運算式(或非擷取的群組;有關更多資訊,請參見Regex選項中的 ExplicitCapture 選項)。使用 () 的捕獲基於左括弧按順序從 1 開始自動編號。捕獲元素編號為零的第一個捕獲是由整個Regex模式比對的文本。 |
(?< name > 子運算式) |
將匹配的子運算式捕獲到一個組名稱或編號名稱中。用於 name 的字串不得包含任何標點符號,並且不能以數字開頭。可以使用單引號替代角括弧,例如 (?'name')。 |
(?< name1 - name2 > 子運算式) |
(平衡組定義。)刪除先前定義的 name2 組的定義,並在 name1 組中儲存先前定義的 name2 組和當前組之間的間隔。如果未定義 name2 組,則匹配將回溯。由於刪除 name2 的最後一個定義會顯示 name2 的先前定義,因此該構造允許將 name2 組的捕獲堆棧用作計數器,用於跟蹤嵌套構造(如括弧)。在此構造中,name1 是可選的。可以使用單引號替代角括弧,例如 (?'name1-name2')。 有關更多資訊,請參見本主題中的樣本。 |
(?: 子運算式) |
(非擷取的群組。)不捕獲由子運算式匹配的子字串。 |
(?imnsx-imnsx: 子運算式) |
應用或禁用子運算式中指定的選項。例如,(?i-s: ) 將開啟不區分大小寫並禁用單行模式。有關更多資訊,請參見Regex選項。 |
(?= 子運算式) |
(零寬度正預測先行斷言。)僅當子運算式在此位置的右側匹配時才繼續匹配。例如,"w+(?="d) 與後跟數位單詞匹配,而不與該數字匹配。此構造不會回溯。 |
(?! 子運算式) |
(零寬度負預測先行斷言。)僅當子運算式不在此位置的右側匹配時才繼續匹配。例如,"b(?!un)"w+"b 與不以 un 開頭的單詞匹配。 |
(?<= 子運算式) |
(零寬度正回顧後發斷言。)僅當子運算式在此位置的左側匹配時才繼續匹配。例如,(?<=19)99 與跟在 19 後面的 99 的執行個體匹配。此構造不會回溯。 |
(?<! 子運算式) |
(零寬度負回顧後發斷言。)僅當子運算式不在此位置的左側匹配時才繼續匹配。 |
(?> 子運算式) |
(非回溯子運算式(也稱為“貪婪”子運算式)。)該子運算式僅完全符合一次,然後就不會逐段參與回溯了。(也就是說,該子運算式僅與可由該子運算式單獨匹配的字串匹配。) 預設情況下,如果匹配未成功,回溯會搜尋其他可能的匹配。如果已知無法成功回溯,可以使用非回溯子運算式避免不必要的搜尋,從而提高效能。 |
命名捕獲基於左括弧按從左至右的順序依次編號(與非命名捕獲類似),但在對所有非命名捕獲進行計數之後才開始對命名捕獲編號。例如,模式 ((?<One>abc)/d+)?(?<Two>xyz)(.*) 按編號和名稱產生下列擷取的群組。(編號為 0 的第一個捕獲總是指整個模式)。
編號 |
名稱 |
模式 |
0 |
0(預設名稱) |
((?<One>abc)/d+)?(?<Two>xyz)(.*) |
1 |
1(預設名稱) |
((?<One>abc)/d+) |
2 |
2(預設名稱) |
(.*) |
3 |
1 |
(?<One>abc) |
4 |
2 |
(?<Two>xyz) |
平衡組定義樣本
下面的程式碼範例示範使用平衡組定義匹配輸入字串中的左右角括弧 (<>)。在該樣本中,像使用堆棧那樣使用 Open 組和 Close 組的捕獲集合來跟蹤角括弧配對:將所捕獲的各左角括弧放入 Open 組的捕獲集合中;將所捕獲的各右角括弧放入 Close 組的捕獲集合中;平衡組定義確保每個左角括弧均有一個匹配的右角括弧。
// This code example demonstrates using the balancing group definition feature of
// regular expressions to match balanced left angle bracket (<) and right angle
// bracket (>) characters in a string.
using System;
using System.Text.RegularExpressions;
class Sample
{
public static void Main()
{
/*
The following expression matches all balanced left and right angle brackets(<>).
The expression:
1) Matches and discards zero or more non-angle bracket characters.
2) Matches zero or more of:
2a) One or more of:
2a1) A group named "Open" that matches a left angle bracket, followed by zero
or more non-angle bracket characters.
"Open" essentially counts the number of left angle brackets.
2b) One or more of:
2b1) A balancing group named "Close" that matches a right angle bracket,
followed by zero or more non-angle bracket characters.
"Close" essentially counts the number of right angle brackets.
3) If the "Open" group contains an unaccounted for left angle bracket, the
entire regular expression fails.
*/
string pattern = "^[^<>]*" +
"(" +
"((?'Open'<)[^<>]*)+" +
"((?'Close-Open'>)[^<>]*)+" +
")*" +
"(?(Open)(?!))$";
string input = "<abc><mno<xyz>>";
//
Match m = Regex.Match(input, pattern);
if (m.Success == true)
Console.WriteLine("Input: ""{0}"" "nMatch: ""{1}""", input, m);
else
Console.WriteLine("Match failed.");
}
}
/*
This code example produces the following results:
Input: "<abc><mno<xyz>>"
Match: "<abc><mno<xyz>>"
*/