正则小知识-捕获组
捕获组其实就是一个分组,对匹配结果进行分组
语法:在正则表达式中用 ()
括号括起来的部分就是一个捕获组
给捕获组命名:(?<xxx>)
xxx 即为捕获组的名称
如何只想让括号作为一个整体,而不是捕获组呢?(?:)
在捕获组前添加?!即不会成为捕获组
//比如:
const reg = /(\d[a-z])[a-z]+/
const str = "78dsadasd-dasd9dsaf8dasd"
const result = reg.exec(str)
console.log(result);
// 输出如下:
Array(2)
0:"8dsadasd"
1:"8d"
groups:undefined
index:1
input:"78dsadasd-dasd9dsaf8dasd"
// 具名捕获组
const reg = /(?<我是有名字的捕获组>\d[a-z])[a-z]+/
//输出如下:
Array(2)
0:"8dsadasd"
1:"8d"
groups:{
我是有名字的捕获组:"8d"
}
index:1
input:"78dsadasd-dasd9dsaf8dasd"
// 非捕获组
const reg = /(?:\d[a-z])[a-z]+/
// 输出如下:
Array(2)
0:"8dsadasd"
groups:undefined
index:1
input:"78dsadasd-dasd9dsaf8dasd"
结果解释如下:
数组第0项:即正则匹配的结果
数组第1~n项:即正则表达式中捕获组捕获的结果,每个捕获组对应一个下标。对应顺序为从左至右
index:这次匹配结果在匹配字符串中的起始下标
input:匹配字符串
groups:为具名捕获组
练习
/**
* 将给定字符串的日期 2023-6-3 - 2023-6-18 替换成 2023/6/3 - 2023/6/18
*/
const str = "2023-6-3 - 2023-6-18"
// 当然题目解决方式有很多种,这次使用正则
const reg = /(\d{4})-(\d{1,2})-(\d{1,2})/g
// replace 中回调函数的参数:第一个为 匹配结果,后面则是捕获组对应捕获的结果
const result = str.replace(reg,(match,g1,g2,g3)=>`${g1}/${g2}/${g3}`)
console.log(result);
// 输出 2023/6/3 - 2023/6/18
// 甚至可以写成如下方式 $1 $2 $3 分别对应三个捕获组的结果
const result2 = str.replace(reg,"$1/$2/$3");
// 输出:2023/6/3 - 2023/6/18