JS 正则表达式 具名组匹配

发布于 2025-01-13 05:19:48 字数 2615 浏览 2 评论 0

具名组匹配

正则表达式使用圆括号进行组匹配。

const RE_DATE = /(\d{4})-(\d{2})-(\d{2})/

使用 exec 方法,就可以将这三组匹配结果提取出来。

const matchObj = RE_DATE.exec('1999-12-31')
const year = matchObj[1] // 1999
const month = matchObj[2] // 12
const day = matchObj[3] // 31
//此时字符窜年月日如果颠倒了 matchObj 后面序号也要修改

ES2018 引入了具名组匹配(Named Capture Groups),允许为每一个组匹配指定一个名字,既便于阅读代码,又便于引用。

const RE_DATE = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/
const matchObj = RE_DATE.exec('1999-12-31')
const year = matchObj.groups.year // 1999
const month = matchObj.groups.month // 12
const day = matchObj.groups.day // 31
  • 添加 id 的方式为在圆括号内部,模式的头部添加“问号 + 尖括号 + 组名”(?\<year\>)</year\>
  • 数字序号(matchObj[1])依然有效
  • 没有匹配到的 id 则返回 undefined
    例子
let {groups: {one, two}} = /^(?<one>.*):(?<two>.*)$/u.exec('foo:bar')
one  // foo
two  // bar
let re = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u
'2015-01-02'.replace(re, '
 
lt;day>/
 
lt;month>/
 
lt;year>') // '02/01/2015' 
'2015-01-02'.replace(re, (
matched, // 整个匹配结果 2015-01-02
capture1, // 第一个组匹配 2015
capture2, // 第二个组匹配 01
capture3, // 第三个组匹配 02
position, // 匹配开始的位置 0
S, // 原字符串 2015-01-02
groups // 具名组构成的一个对象 {year, month, day}
) => {
let {day, month, year} = groups
return `${day}/${month}/${year}`
})

具名组匹配在原来的基础上,新增了最后一个函数参数(groups):具名组构成的一个对象。函数内部可以直接对这个对象进行解构赋值。

具名组匹配引用

正则表达式内部引用某个“具名组匹配”,可以使用\k<组名>的写法。

const RE_TWICE = /^(?<word>[a-z]+)!\k<word>$/
RE_TWICE.test('abc!abc') // true
RE_TWICE.test('abc!ab') // false

数字引用(\1)依然有效。

const RE_TWICE = /^(?<word>[a-z]+)!\1$/
RE_TWICE.test('abc!abc') // true
RE_TWICE.test('abc!ab') // false

同时使用

const RE_TWICE = /^(?<word>[a-z]+)!\k<word>!\1$/
RE_TWICE.test('abc!abc!abc') // true
RE_TWICE.test('abc!abc!ab') // false

String.prototype.matchAll

一次性取出所有匹配。不过,它返回的是一个遍历器(Iterator),而不是数组。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

无悔心

暂无简介

文章
评论
25 人气
更多

推荐作者

最终幸福

文章 0 评论 0

与酒说心事

文章 0 评论 0

┈┾☆殇

文章 0 评论 0

梦醒灬来后我

文章 0 评论 0

念﹏祤嫣

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文