正则的分组捕获

// => 身份证号码
let str = '123456198010101931'
let reg = /^(\d{6})(\d{4})(\d{2})(\d{2})\d{2}(\d)(?:\d|X)$/
console.log(reg.exec(str))
console.log(str.match(reg))
// => ["123456198010101931", "123456", "1980", "10", "10", "3", "1", index: 0, input: "123456198010101931"]
// => 第一项:大正则匹配的结果
// => 其余项:每一个小分组单独匹配捕获的结果
// => 如果设置了分组(改变优先级),但是捕获的时候不需要单独捕获,可以基于 ?: 来处理

// => 既要捕获到{数字},也想单独的把数字也获取到,例如:第一次找到{0},还需要单独获取0
let str = '{0}年{1}月{2}日'
// => 不设置 g 只匹配一次,exec和match获取的结果一致(既有大正则匹配的信息,也有小分组匹配的信息)
let reg = /\{(\d+)\}/
console.log(reg.exec(str))
console.log(str.match(reg))
["{0}", "0"]

let str = '{0}年{1}月{2}日'
let reg = /\{(\d+)\}/g
console.log(str.match(reg))   // => ["{0}", "{1}", "{2}"]
// 多次匹配的情况下,match只能把大正则匹配的内容捕获到,小分组匹配的内容无法获取

let str = '{0}年{1}月{2}日'
let reg = /\{(\d+)\}/g
let aryBig = [],
    arySmall = [],
    res = reg.exec(str)
while(res){
    let [big,small] = res   // => 解构赋值
    aryBig.push(big)
    arySmall.push(small)
    res = reg.exec(str)
}
console.log(aryBig,arySmall)
// => ["{0}", "{1}", "{2}"]   ["0", "1", "2"]

// => 分组的第三个作用:'分组引用'
let str = 'book';   // => 'good'、'look'、'moon'、'foot'...
let reg = /^[a-zA-Z]([a-zA-Z])\1[a-zA-Z]$/   // => 分组引用就是通过 '\数字' 让其代表和对应分组出现一模一样的内容
console.log(reg.test('book'))   // => true
console.log(reg.test('good'))   // => true
console.log(reg.test('look'))   // => true
console.log(reg.test('foot'))   // => true
console.log(reg.test('fort'))   // => false

你可能感兴趣的:(RegExp,前端)