四、正则捕获(四)----replace方法的正确使用姿势

在上一下小节,我们在文章结尾的地方使用了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方法,我们实现了正则匹配,1,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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容