成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

重復命名捕獲組,你學廢了嗎?

開發 前端
通常,我們不允許捕獲組的名字重復,因為一個捕獲組只能有一個值,如果有多個同名的捕獲組,它就不知道該抓哪個了。

新特性:重復命名捕獲組

大家好!今天我們來聊聊 ECMAScript 2025 帶來的一個新特性——“重復命名捕獲組”。這個特性是由 Kevin Gibbons 提出的,它讓我們能夠在正則表達式中多次使用同一個捕獲組的名字。

重復命名捕獲組

通常,我們不允許捕獲組的名字重復,因為一個捕獲組只能有一個值,如果有多個同名的捕獲組,它就不知道該抓哪個了。比如下面這樣:

/^(?<x>a)(?<x>b)$/

這段代碼會拋出一個錯誤,因為捕獲組 x 可以捕獲 'a' 或 'b',但它不能同時捕獲兩個。

但是,如果同名的捕獲組出現在不同的選擇分支中,那就沒有沖突了。之前這是不允許的,但現在可以了。比如:

/^((?<x>a)|(?<x>b))$/.exec('a').groups
// { x: 'a' }
/^((?<x>a)|(?<x>b))$/.exec('b').groups
// { x: 'b' }

這有什么用呢?它讓我們能夠在不同的選擇分支之間重用正則表達式的片段和匹配處理代碼。

接下來,我們通過一些例子來看看它的實際應用。

具有相似部分的替代格式

parseMonth() 函數使用正則表達式來解析具有兩種不同月格式的字符串:

const RE_MONTH = new RegExp(
  `^(${'year=\\\\d{4}-'}month=\\\\d{2}}|${'month=\\\\d{2}\\\\/'}year=\\\\d{4}})$`
);

function parseMonth(monthStr) {
  const match = RE_MONTH.exec(monthStr);
  if (match === null) {
    throw new Error('這不是一個有效的月份字符串:' + JSON.stringify(monthStr));
  }
  // 兩種情況都用同一段代碼
  return {
    year: match.groups.year,
    month: match.groups.month,
  };
}

console.log(parseMonth('2024-05'));
// { year: '2024', month: '05' }
console.log(parseMonth('05/2024'));
// { year: '2024', month: '05' }
assert.throws(() => parseMonth('2024/05'));

重用正則表達式片段

下面的代碼展示了如何通過重復命名捕獲組來重用正則表達式的片段——在這個例子中是 KEY 和 VALUE。

const KEY = `(?<key>[a-z]+)`;
const VALUE = `(?<value>[a-z]+)`;
const RE_KEY_VALUE_PAIRS = new RegExp(
  `\\\\(${KEY}=${VALUE}\\\\)|\\\\[${KEY}:${VALUE}\\\\]`,
  'g'
);

const str = '[one:a] (two=b)';
const objects = Array.from(
  str.matchAll(RE_KEY_VALUE_PAIRS),
  // 兩種情況都用同一段代碼
  (match) => ({key: match.groups.key, value: match.groups.value})
);
console.log(objects);
// [
//   { key: 'one', value: 'a' },
//   { key: 'two', value: 'b' },
// ]

解釋

  • string.matchAll() 返回一個可迭代對象。
  • 我們使用 Array.from() 將這個可迭代對象轉換為數組。
  • Array.from() 的第二個可選參數是一個回調函數,它在元素放入返回的數組之前被應用。可以想象成 array.map()。

反向引用

對重復命名組的反向引用按預期工作。下面的例子有些牽強(因為我們本可以使用單個命名組),但它展示了可能性:

const RE_DELIMITED = /^((?<delim>\\_)|(?<delim>\\*))[a-z]+\\k<delim>$/;
console.log(RE_DELIMITED.test('_abc_')); // true
console.log(RE_DELIMITED.test('*abc*')); // true
console.log(RE_DELIMITED.test('_abc*')); // false
console.log(RE_DELIMITED.test('*abc_')); // false

支持的 JavaScript 引擎

  • 該提案維護了一個引擎列表[1],這些引擎已經支持重復命名捕獲組。
  • 我使用 Markcheck[2] 測試了這篇博客文章中的代碼,并使用了一個 Babel 插件[3](因為 Node 的 V8 還不支持這個特性)。
  • 注意:它只透明支持正則表達式字面量;我使用了一個 變通方法[4]。

結論

在實踐中,重復命名捕獲組對于那些基于正則表達式的解析器和分詞器的編寫者來說最有用。對這些人來說,這是一個非常受歡迎的補充。

本文譯自:https://2ality.com/2024/05/proposal-duplicate-named-capturing-groups.html

責任編輯:武曉燕 來源: 前端F2E
相關推薦

2020-12-17 08:39:36

Css前端html

2022-06-01 08:21:24

Java內存API

2023-09-26 00:45:11

MySQL拆表分片

2024-09-02 08:00:00

2023-12-11 08:03:01

Java線程線程組

2023-12-06 08:01:03

CSSPostCSS

2024-04-09 13:16:21

Rust命名規范

2009-03-12 10:15:15

正則表達式JDK7Java

2022-02-09 23:02:53

Vuex開發管理模式

2023-12-06 08:28:44

禮物系統用例圖

2012-01-13 13:05:41

Scale Out網絡

2024-04-26 00:15:51

2021-04-13 15:56:24

JavaPython技術

2013-07-15 16:55:45

2012-03-12 13:47:05

移動廣告

2009-06-22 14:36:09

ITIL運維管理摩卡軟件

2010-08-04 15:01:00

2012-08-29 09:44:20

免費增值

2009-08-20 13:44:07

C#正則表達式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜视频一区二区三区 | 伊人超碰 | 亚洲精品在线视频 | 国产在线拍偷自揄拍视频 | 国产成人99久久亚洲综合精品 | 中文字幕高清在线 | 亚洲黄色在线免费观看 | 国产99久久久国产精品 | 国产成人久久精品一区二区三区 | 亚洲成av| 美女131mm久久爽爽免费 | 国产精品成人一区二区三区吃奶 | 欧美高清dvd | 一级黄色片一级黄色片 | 人人射人人草 | 久久97精品| 日韩高清三区 | 精品久久一 | 亚洲视频在线观看 | 日韩一区在线观看视频 | a级在线免费 | 北条麻妃国产九九九精品小说 | 欧美日韩国产一区二区三区 | 国产亚洲精品久久久优势 | 国产在线观看 | 国产精品视频一二三区 | 在线亚洲人成电影网站色www | 亚洲喷水 | 欧区一欧区二欧区三免费 | 妹子干综合 | 久久久久国产一区二区三区 | 亚洲欧美国产精品久久 | 午夜在线小视频 | 在线观看中文字幕 | 欧美精品乱码久久久久久按摩 | 91久久久久久久久久久 | 国精产品一品二品国精在线观看 | 久久久精品网站 | 亚洲天堂久久 | 免费观看一级毛片 | 日本一区二区三区在线观看 |