正则分组
分组定义
正则表达式分组分为 捕获组 和 非捕获组,捕获组又分为 普通捕获组 和 命名捕获组 ,捕获组可用于正则内部进行反向引用,也可以在正则外部使用
- 捕获组 - 就是把正则表达式中子表达式匹配的内容,保存到以数字编号或显式命名的组里
- 普通捕获组 - 正则表达式中(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"]