分組構造使您可以捕獲子運算式組並提高具有非捕獲預測先行和回顧後發修飾符的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)
|