正则表达式具名捕获组

正则表达式使用()进行组匹配。

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

const matchObj = RE_DATE.exec('1999-12-31')
const year = matchObj[1] // 1999
const month = matchObj[2] // 12
const day = matchObj[3] // 31

组匹配的一个问题是,每一组的匹配含义不容易看出来,而且只能用索引取值,如果组的顺序变了,引用也需要修改。

ES2018 引入了具名捕获组(Named Capture Groups),允许为每一个组匹配指定一个名字。使用方式为 (?<Name>x),尖括号(<>) 用于组名,<Name> 为指定的属性名,“x”是要匹配的字符串。

let users = `姓氏: 李, 名字: 雷
姓氏: 韩, 名字: 梅梅`

let regexpNames = /姓氏: (?<first>.+), 名字: (?<last>.+)/gm
let match = regexpNames.exec(users)

do {
  console.log(`Hello ${match.groups.first} ${match.groups.last}`)
} while ((match = regexpNames.exec(users)) !== null)

// Hello 李 雷
// Hello 韩 梅梅

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

const RE_OPT_A = /^(?<as>a+)?$/
const matchObj = RE_OPT_A.exec('')

matchObj.groups.as // undefined
matchObj.groups // {as: undefined}
'as' in matchObj.groups // true
Copyright © 零度实验室 2020 all right reserved,powered by Gitbook修订时间: 2021-07-02 10:46:52

results matching ""

    No results matching ""