捕獲組:(...)
捕獲組將一個子模式分組,允許您將量詞應用於整個組或在其中使用或運算子。它會記住有關子模式匹配的資訊,以便您以後可以透過反向引用引用它,或者透過匹配結果訪問該資訊。
如果您不需要子模式匹配的結果,請改用非捕獲組,這可以提高效能並避免重構風險。
語法
(pattern)
引數
描述
捕獲組的作用類似於 JavaScript 表示式中的分組運算子,允許您將子模式用作單個原子。
捕獲組按其開括號的順序編號。第一個捕獲組編號為1,第二個為2,依此類推。命名捕獲組也是捕獲組,並與其他(未命名)捕獲組一起編號。捕獲組的匹配資訊可以透過以下方式訪問:
RegExp.prototype.exec()、String.prototype.match()和String.prototype.matchAll()的返回值(一個數組)String.prototype.replace()和String.prototype.replaceAll()方法的replacement回撥函式的pN引數- 同一模式中的反向引用
注意:即使在 exec() 的結果陣列中,捕獲組也透過數字 1、2 等訪問,因為 0 元素是整個匹配。\0 不是反向引用,而是 NUL 字元的字元轉義。
正則表示式原始碼中的捕獲組與其結果一一對應。如果捕獲組不匹配(例如,它屬於或運算子中不匹配的替代項),則相應的結果為 undefined。
/(ab)|(cd)/.exec("cd"); // ['cd', undefined, 'cd']
捕獲組可以量化。在這種情況下,與此組對應的匹配資訊是該組的最後一次匹配。
/([ab])+/.exec("abc"); // ['ab', 'b']; because "b" comes after "a", this result overwrites the previous one
捕獲組可以在先行斷言和後行斷言中使用。由於後行斷言向後匹配其原子,因此與此組對應的最終匹配是出現在字串左端的那個。但是,匹配組的索引仍然對應於它們在正則表示式原始碼中的相對位置。
/c(?=(ab))/.exec("cab"); // ['c', 'ab']
/(?<=(a)(b))c/.exec("abc"); // ['c', 'a', 'b']
/(?<=([ab])+)c/.exec("abc"); // ['c', 'a']; because "a" is seen by the lookbehind after the lookbehind has seen "b"
捕獲組可以巢狀,在這種情況下,外層組首先編號,然後是內層組,因為它們按其開括號的順序排列。如果巢狀組被量詞重複,則每次組匹配時,子組的結果都會被覆蓋,有時會是 undefined。
/((a+)?(b+)?(c))*/.exec("aacbbbcac"); // ['aacbbbcac', 'ac', 'a', undefined, 'c']
在上面的示例中,外部組匹配了三次
- 匹配
"aac",子組為"aa"、undefined和"c"。 - 匹配
"bbbc",子組為undefined、"bbb"和"c"。 - 匹配
"ac",子組為"a"、undefined和"c"。
第二次匹配的 "bbb" 結果沒有保留,因為第三次匹配將其覆蓋為 undefined。
您可以使用 d 標誌獲取輸入字串中每個捕獲組的開始和結束索引。這會在 exec() 返回的陣列上建立一個額外的 indices 屬性。
您可以選擇為捕獲組指定名稱,這有助於避免與組位置和索引相關的陷阱。有關更多資訊,請參閱命名捕獲組。
括號在不同的正則表示式語法中有其他用途。例如,它們也用於包含先行斷言和後行斷言。由於這些語法都以 ? 開頭,而 ? 是一個量詞,通常不能直接出現在 ( 之後,因此這不會導致歧義。
示例
匹配日期
以下示例匹配 YYYY-MM-DD 格式的日期
function parseDate(input) {
const parts = /^(\d{4})-(\d{2})-(\d{2})$/.exec(input);
if (!parts) {
return null;
}
return parts.slice(1).map((p) => parseInt(p, 10));
}
parseDate("2019-01-01"); // [2019, 1, 1]
parseDate("2019-06-19"); // [2019, 6, 19]
配對引號
以下函式匹配字串中的 title='xxx' 和 title="xxx" 模式。為了確保引號匹配,我們使用反向引用來引用第一個引號。訪問第二個捕獲組 ([2]) 將返回匹配引號字元之間的字串
function parseTitle(metastring) {
return metastring.match(/title=(["'])(.*?)\1/)[2];
}
parseTitle('title="foo"'); // 'foo'
parseTitle("title='foo' lang='en'"); // 'foo'
parseTitle('title="Named capturing groups\' advantages"'); // "Named capturing groups' advantages"
規範
| 規範 |
|---|
| ECMAScript® 2026 語言規範 # prod-Atom |
瀏覽器相容性
載入中…