阿西河

所有教程

公众号
🌙
阿西河前端的公众号

我的收藏

    最近访问  (文章)

      教程列表

      抓包专区
      测试专区

      JavaScript replace和实战

      replace和实战

      ** replace:把原有的字符替换成新的字符 **

      在不使用正则的情况下,每当执行一次只能替换一个字符

      var str = "zhu2015zhu2016zhu2017zhu2018";
      str = str.replace("zhu", "-replace-"); //->没有实现需求
      console.log(str);
      
      • 1、replace第一项的值是一个正则它的实现原理

          var str = "zhu2015zhu2016zhu2017zhu2018";
          str = str.replace(/zhu/g, "[OK]");//
          console.log(str);//[OK]2015[OK]2016[OK]2017[OK]2018
        

        首先我们和exec捕获一样,把所有和我们正则匹配的都捕获到,然后把捕获的内容替换成我们需要替换的新内容

          //-> /zhu/g 按照这个正则把str中所有可以匹配的都捕获到,然后统一都替换成"newStr"
          var str = "zhu2015zhu2016";
          var reg = /zhu/g;
          console.log(reg.exec(str));//->["zhu", index: 0, input: "zhu2015zhu2016"]
          console.log(reg.exec(str));//->["zhu", index: ?, input: "?"]
          str = str.replace(/zhu/g, function () {
              //console.log(arguments);
              //第一次执行匿名函数的结果->["zhu", 0, "zhu2015zhu2016"]
              //第二次执行匿名函数的结果->["zhu", ?, "?"]
              return "newStr";
          });
          console.log(str);
        
      • 2、第二个参数换成一个函数

        • 1)、匿名函数执行多少次,取决于正则能在字符串中捕获多少次 ->正则捕获两次,所以我们的匿名函数也执行两次

        • 2)、每一次执行匿名函数,里面传递的参数值arguments和我们自己通过exec捕获到的结果是非常的类似的(即使正则有分组,我们同样可以通过arguments获取到分组捕获的内容)

        • 3)return: 你返回的结果是啥,就相当于把当前这一次大正则捕获的内容替换成你返回的内容

            var str = "zhu2015zhu2016";
            str = str.replace(/\d+/g, function () {
                console.log(arguments[0]);//每一次执行匿名函数把我们大正则捕获的内容获取到
                return 1;//我返回的1把每一次大正则匹配捕获的内容都替换了
            });
            console.log(str);//->"zhu1zhu1"
          

          例子:

            var str = "zhu2015zhu2016";
            var reg = /(\d+)/g;
            str = str.replace(reg, function () {
                console.log(arguments,RegExp.$1);//获取每一次执行匿名函数我们正则捕获到的第一个分组中的内容
                return "----"
            });
            console.log(str);
            console.log(RegExp.$1);//2016 获取第一个分组捕获的内容
          

      替换文字

      var str = "20151213";//->"贰零壹伍壹贰壹叁"
      var ary = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"];
      str = str.replace(/\d/g, function () {
          return ary[arguments[0]];
      });
      console.log(str);
      

      阿拉伯数字转为财务数字;

      function toChinaNumber (options) {
          options=options+"";
          options = options.replace(/^0+/, "");
          var numberAry = ["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"],
                  unitAry = ["","拾","佰","仟"],
                  bigUnitAry = ["","万","亿"];
          var targetStr = "";
          var zeroFlag = 0;
          var i, p, nowAloneNumber;
          var quotient, modulus;
          var len=options.length;
          if(len==0){
              targetStr += "零";
          }else{
              for (i = 0; i < len; i++) {
                  p = len - i - 1;
                  nowAloneNumber = options.substr(i, 1);
                  quotient = p / 4;//商
                  modulus = p % 4;//余数
                  if (nowAloneNumber == "0") {
                      zeroFlag++;
                  } else {
                      if (zeroFlag > 0) {
                          targetStr += numberAry[0];
                      }
                      zeroFlag = 0;
                      targetStr += numberAry[Number(nowAloneNumber)] + unitAry[modulus];
                  }
                  if (modulus == 0 && zeroFlag < 4) {
                      targetStr += bigUnitAry[quotient];
                      zeroFlag = 0;
                  }
              }
          }
          targetStr += "元整";
          return targetStr;
      }
      
      var testNumber=35987;
      var testStr="298";
      console.log(toChinaNumber(testNumber));
      console.log(toChinaNumber(testStr));
      目录
      目录