正则表达式捕获组,正则表达式非捕获组,正则表达式命名捕获组,正则表达式反向引用,正则表达式分组

正则表达式捕获组,正则表达式非捕获组,正则表达式命名捕获组,正则表达式反向引用,正则表达式分组

正则分组

分组定义

正则表达式分组分为 捕获组非捕获组,捕获组又分为 普通捕获组命名捕获组 ,捕获组可用于正则内部进行反向引用,也可以在正则外部使用

  • 捕获组 - 就是把正则表达式中子表达式匹配的内容,保存到以数字编号或显式命名的组里
    • 普通捕获组 - 正则表达式中(Expression)部分即为普通捕获组
    • 命名捕获组 - 正则表达式中(?<name>Expression)部分即为命名捕获组,其它的(?...)语法都不是捕获组
  • 非捕获组 - 在捕获组中加上 ?: 为非捕获组,即(?:expression),该部分不会保存到组里

捕获组规则

  • 编号规则:默认整个正则表达式编号为组0,其它捕获组编号依次为 1、2、3...
  • 顺序规则:从正则表达式的最左边依次寻找左小括号 ( , 根据查找的顺序依次编号,需排除以下几种情况
    • 小括号被转义 \(
    • 非捕获组 (?:)
    • 中括号中的小括号(被转义) [ ( ]
    • 正则断言(环视) (?=) (?!) (?<=) (?<!)

反向引用:反向引用是一种匹配与捕获组先前匹配的相同文本的方法

普通捕获组
// 正则 /(\d+)([a-z]+)/ 整体为组0,(\d+)为组1,([a-z]+)为组2
console.log( /(\d+)([a-z]+)/.exec('123xyz') );          // ["123xyz","123","xyz"]
命名捕获组
// 正则 /(?<name>\d+)([a-z]+)/ 整体为组0,(?<name>\d+)是命名捕获组为组1,([a-z]+)为组2
console.log( /(?<name>\d+)([a-z]+)/.exec('123xyz') );
// 结果形式如下,其中groups为命名捕获组键值对象
// [ '123xyz', '123', 'xyz', groups:{name:'123'} ]
嵌套捕获组
// 捕获组内包含其他捕获组时
console.log( /((\d+)-)([a-z]+)/.exec('123-xyz') );      // ["123-xyz","123-","123","xyz"]
非捕获组
// 正则 /(?:\d+)([a-z]+)/ 整体为组0,(?:\d+)是非捕获组不保存在组里,([a-z]+)为组1
console.log( /(?:\d+)([a-z]+)/.exec('123xyz') );        // ["123xyz","xyz"]
反向引用
// 普通捕获组反向引用,正则中 \1 为反向引用,引用第一个组
console.log( /(\d+)([a-z]+)(\1)/.exec('123xyz123') );   // ["123xyz123","123","xyz","123"]

// 命名捕获组反向引用,正则中 \k<key> 为反向引用(key为捕获组名称),引用第一个组
console.log( /(?<key>\d+)([a-z]+)(\k<key>)/.exec('123xyz123') ); // ["123xyz123","123","xyz","123"]