正则-replace

2017-03-09  本文已影响0人  阿九是只大胖喵

replace: 把原有的字符替换成新的字符。
在不使用正则的情况下,每当执行一次只能替换一个字符。

    var str = 'derrick20derrick21';
    str = str.replace('derrick', 'Qian');
    // 没有实现需求
    console.log(str);

    var str = 'derrick20derrick21';
    str = str.replace(/derrick/g, 'Qian');
    console.log(str)

replace第一项的值是一个正则,它的实现原理:
首先和exec捕获一样,把所有和正则匹配的都捕获到,然后把捕获的内容替换成我们需要替换的新内容。/derrick/g按照这个正则把str中所有可以匹配的都捕获到,然后统一都替换成指定的字符串"Qian"。

    var str = 'derrick20derrick21';
    str = str.replace(/derrick/g, function () {
        console.log('ok'); // 执行了两次
        console.log(arguments); // 输出和exec执行的结果一样,输出两次
        // 第一次输出第一次exec捕获点击结果,第二次输出第二次exec捕获的结果
        return "Qian";
    });

第二个参数换成一个函数

  1. 匿名函数执行多少次,取决于正则能在字符串中捕获多少次 -> 正则捕获两次,所以匿名函数也执行两次。
  2. 每一次执行匿名函数,里面传递的参数值arguments和通过exec捕获到的结果是非常类似的。即使正则有分组,我们同样可以通过arguments获取到分组捕获的内容。
  3. return: 返回的结果是什么,就相当于把当前这一次大正则捕获的内容替换成返回的内容。
    var str = 'derrick20derrick21';
    str = str.replace(/\d+/g, function () {
        console.log(arguments[0]); // 每次捕获的内容
        return 1; // 把每一次大正则匹配的内容替换成1
    });
    console.log(str);

    var str = 'derrick20derrick21';
    str = str.replace(/\d+/g, function () {
        console.log(arguments[1]); // 获取每一次执行匿名函数,正则捕获到的第一个分组中的内容
        console.log(RegExp.$1); // 和上一行一样的功能
    });

实战
1. 将小写的数字替换成大写的中文数字

    var str = "号码: 12345";
    var ary = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"];
    str = str.replace(/\d/g, function () {
        /**
         * 第一次执行: 大正则捕获的是1,返回的是ary[1] -> 壹
         * 第二次执行: 大正则捕获的是2,返回的是ary[1] -> 贰
         * ...
         * */
        return ary[arguments[0]];
    });
    console.log(str);

2. 获取一个字符串中出现次数最多的字符,并且获取出现次数

    var str = 'derrickrosekobebryantmichealjordan';
    // 1) 获取每一个字符出现的次数
    var obj = {};
    str.replace(/[a-z]/gi, function () {
        var val = arguments[0];
        /*
        if (obj[val] >= 1) {
            obj[val]++;
        } else {
            obj[val] = 1;
        }
        */
        obj[val] >= 1 ? obj[val]++ : obj[val] = 1;
    });
    // 2) 获取最多出现的次数
    var maxNum = 0;
    for (var key in obj) {
        obj[key] > maxNum ? maxNum = obj[key] : null;
    }
    // 3) 把所有符合出现maxNum次数的都获取到
    var ary = [];
    for (var key in obj) {
        obj[key] === maxNum ? ary.push(key) : null;
    }
    console.log("最多次数的字符: " + ary.toString() + ", 出现了: " + maxNum + "次");

3. 模板引擎实现初步原理

    var str = "my name is {0}, my age is {1}, i come from {2}, i love {3}";
    var ary = ['derrick', '20', 'china', 'javascript'];
    str = str.replace(/{(\d+)}/g, function () {
        return ary[arguments[1]];
    });
    console.log(str);
上一篇下一篇

猜你喜欢

热点阅读