ES6 正则表达式之具名组匹配

组匹配

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

const reg= /(\d{4})-(\d{2})-(\d{2})/
const result = reg.exec('2018-10-24')
result // ["2018-10-24", "2018", "10", "24", ...]

返回的结果是一个数组,组匹配的结果只能用数组索引来引用,比如 result[1]

具名组匹配

ES2018 引入了具名组匹配,允许为每一个组匹配指定一个名字

const reg = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/
const result = reg.exec('2018-10-24')
result.groups.year  // 2018
result.groups.month  // 10
result.groups.day  // 24

上面代码中,具名组匹配在圆括号内部,模式的头部添加“问号 + 尖括号 + 组名”,然后就可以在 exec 方法返回结果的 groups 属性上引用该组名

如果具名组没有匹配,那么对应的 groups 对象属性会是 undefined

解构赋值

有了具名组匹配以后,可以使用解构赋值直接从匹配结果上为变量赋值

let {groups: {one, two}} = /^(?<one>.*):(?<two>.*)$/.exec('foo:bar')
one  // foo
two  // bar

字符串替换

字符串替换时,使用 $<组名> 引用具名组

let reg = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/
'2018-10-24'.replace(reg, '$<day>/$<month>/$<year>')
// 24/10/2018

replace方法的第二个参数也可以是函数,该函数的参数序列如下

let reg = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/
'2018-10-24'.replace(re, (
   matched, // 整个匹配结果 2018-10-24
   capture1, // 第一个组匹配 2018
   capture2, // 第二个组匹配 10
   capture3, // 第三个组匹配 24
   position, // 匹配开始的位置 0
   S, // 原字符串 2018-10-24
   groups // 
 let {day, month, year} = groups
 return `${day}/${month}/${year}`
})

其中最后一个参数 groups 为 ES6 新增,即具名组构成的一个对象

引用

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

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

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

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

本文转载自 http://es6.ruanyifeng.com/#docs/regex#具名组匹配 并进行整理

除特殊说明外本人博客均属原创,转载请注明出处:http://blog.johnhan.cn/blog_1023.html
鄂ICP备17018604号-1  鄂公网安备42060702000030号