美文网首页
正则-replace

正则-replace

作者: 阿九是只大胖喵 | 来源:发表于2017-03-09 17:59 被阅读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);
    

    相关文章

      网友评论

          本文标题:正则-replace

          本文链接:https://www.haomeiwen.com/subject/ahhggttx.html