在上一下小节,我们在文章结尾的地方使用了replace方法实现了一个简单的功能。本篇中我们接着学习正则replace的方法。
首先来复习一下上一篇中使用replace的简单案例。
// 把时间转换成字符串形式的时间格式
let time = '2019-12-07';
let reg = /^(\d{4})-(\d{2})-(\d{2})$/;
// 转换成2019年12月07日
time.replace(reg,“$1年$2月$3日”);
console.log(time);
通过上面的例子,我们可以看出,通过使用字符串的replace方法,我们实现了正则匹配,2,&3分别为大正则匹配的三个小分组。当然,强大的replace方法不仅只有这么简单的用法,我们还可以通过给replace方法传递参数,来实现更加强大的功能。具体内容,请看下面的示例代码:
let time = '2019-12-07';
let reg = /^(\d{4})-(\d{2})-(\d{2})$/
time = time.replace(reg,(big,$1,$2,$3) => {
console.log(big); // 2019-12-07
console.log($1); // 2019
console.log($2); // 12
console.log($3); //07
})
// 通过上面函数运行的结果,我们就可以理解本文中第一段代码运行的结果。
下面再来看一段代码
let time = '2019-12-07';
let reg = /^(\d{4})-(\d{2})-(\d{2})$/
time = time.replace(reg, (...arg) => {
let [,$1,$2,$3] = arg;
return "@"
})
console.log(time); //"@"
通过上面的三小段代码,我们可看出replace方法有下面这三种特性:
1、首先拿REG和time进行匹配,能匹配几次,就把传递进来的函数执行几遍(而且匹配一次就执行一次),关于这一点,本人通过在使用计数的方式发现,并没有得到累加到3的结果,我个人觉得要么就是在底层运行的,要么就是在这种法说法描述的并不准确,具体的测试代码如下。
2、不仅执行了方法。replace还给方法传递了实参(和exec捕获的内容一致的信息,大正则匹配的内容,小正则匹配的信息)
3、在函数中我们返回的是啥,就把当前大正则匹配的内容替换成啥。
let i = 0;
let time = '2019-12-07';
let reg = /^(\d{4})-(\d{2})-(\d{2})$/
time = time.replace(reg, (...arg) => {
i++;
let [,$1,$2,$3] = arg;
return "$1年$2月$3日"
})
console.log(time);// $1年$2月$3日
console.log(i); // 1