命名捕獲組:(?<name>...)

Baseline 廣泛可用 *

此特性已經十分成熟,可在許多裝置和瀏覽器版本上使用。自 2020 年 7 月以來,它已在各大瀏覽器中可用。

* 此特性的某些部分可能存在不同級別的支援。

命名捕獲組是一種特殊的捕獲組,它允許為組指定一個名稱。組的匹配結果可以透過這個名稱而不是它在模式中的索引來標識。

語法

正則表示式
(?<name>pattern)

引數

pattern

此模式可以包含任何可在正則表示式字面量中使用的內容,包括或運算子

name

組的名稱。必須是有效的識別符號

描述

命名捕獲組可以像常規捕獲組一樣使用——它們在結果陣列中也有它們的匹配索引,並且可以透過\1\2等引用。唯一的區別是它們可以額外地透過它們的名稱引用。捕獲組的匹配資訊可以透過以下方式訪問:

所有名稱在同一模式內必須是唯一的。具有相同名稱的多個命名捕獲組會導致語法錯誤。

js
/(?<name>)(?<name>)/; // SyntaxError: Invalid regular expression: Duplicate capture group name

如果重複的命名捕獲組不在同一個或運算子備選項中,則此限制會放寬,因此對於任何字串輸入,只有一個命名捕獲組實際上可以匹配。這是一個相對較新的功能,因此在使用前請檢查瀏覽器相容性

js
/(?<year>\d{4})-\d{2}|\d{2}-(?<year>\d{4})/;
// Works; "year" can either come before or after the hyphen

所有命名捕獲組都將出現在結果中。如果命名捕獲組未匹配(例如,它屬於或運算子中未匹配的備選項),則 groups 物件上相應的屬性值為 undefined

js
/(?<ab>ab)|(?<cd>cd)/.exec("cd").groups; // [Object: null prototype] { ab: undefined, cd: 'cd' }

您可以使用 d 標誌獲取輸入字串中每個命名捕獲組的起始和結束索引。除了透過 exec() 返回的陣列的 indices 屬性訪問它們之外,您還可以透過它們的名稱在 indices.groups 上訪問它們。

與未命名捕獲組相比,命名捕獲組具有以下優點:

  • 它們允許您為每個子匹配結果提供描述性名稱。
  • 它們允許您訪問子匹配結果,而無需記住它們在模式中出現的順序。
  • 重構程式碼時,您可以更改捕獲組的順序,而不必擔心破壞其他引用。

示例

使用命名捕獲組

以下示例從 Git 日誌條目(使用 git log --format=%ct,%an -- filename 輸出)中解析時間戳和作者名稱

js
function parseLog(entry) {
  const { author, timestamp } = /^(?<timestamp>\d+),(?<author>.+)$/.exec(
    entry,
  ).groups;
  return `${author} committed on ${new Date(
    parseInt(timestamp, 10) * 1000,
  ).toLocaleString()}`;
}

parseLog("1560979912,Caroline"); // "Caroline committed on 6/19/2019, 5:31:52 PM"

規範

規範
ECMAScript® 2026 語言規範
# prod-Atom

瀏覽器相容性

另見