語法
正則表示式
(?<name>pattern)
引數
描述
命名捕獲組可以像常規捕獲組一樣使用——它們在結果陣列中也有它們的匹配索引,並且可以透過\1、\2等引用。唯一的區別是它們可以額外地透過它們的名稱引用。捕獲組的匹配資訊可以透過以下方式訪問:
RegExp.prototype.exec()、String.prototype.match()和String.prototype.matchAll()的返回值的groups屬性String.prototype.replace()和String.prototype.replaceAll()方法的replacement回撥函式的groups引數- 同一模式內的命名反向引用
所有名稱在同一模式內必須是唯一的。具有相同名稱的多個命名捕獲組會導致語法錯誤。
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 |
瀏覽器相容性
載入中…