JS 正则表达式 具名组匹配
具名组匹配
正则表达式使用圆括号进行组匹配。
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 技术交流群。
上一篇: JS ES6 字符串的扩展
下一篇: TypeScript 常见问题
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论