replace的应用

1.将数字字符串变成大写的汉字,eg:"123" => "壹贰叁"

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

 

 

2.模板引擎的初步原理,eg:"my name is {0},my age is {1},i come from {2},i love {3}~~",然后将数组对应项一一放进去["一问", 28, "湖南", "js"],然后得到完整的句子

var str = "my name is {0},my age is {1},i come from {2},i love {3}~~";
  var arr = ["huahua", 28, "beijing", "js"];
  var newStr = str.replace(/{(\d)}/g,function  () {
      var index = arguments[1];
      return arr[index];
  })
  console.log(newStr); 
// my name is huahua,my age is 28,i come from beijing,i love js~~

 

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

 思路:先找到出现的所有字母及其出现的次数,然后找到出现次数的最大值,最后看最大值对应哪些字母

  var str = "huahuaveryxihuanbaozihei";
  var obj = {};
  // 找出现的字母及其出现字数,键值对
  str.replace(/[a-zA-Z]/g, function() {
    var cur = arguments[0];
    if (!(cur in obj)) {
      obj[cur] = 1;
    } else {
      obj[cur]++;
    }
  })
  console.log(obj)
  // 出现次数的最大值
  var max = 0;
  for (var key in obj) {
    if (obj[key] > max) {
      max = obj[key];
    }
  }
  // 最大值对应的字母
  var arr = [];
  for (var key in obj) {
    if (obj[key] === max) {
      arr[arr.length] = key;
    }
  }

  arr.zmax = max;
 console.log(obj);
// {h: 4, u: 3, a: 4, v: 1, e: 2…} console.log(arr);
// ["h", "a", zmax: 4]

突发奇想的想用一次循环,可以跳过,每次匹配的时候,

1) 判断键是否在对象中,若不在创建键值,反之值加1

2) 看对应的键值有没有大于max,若大于的话则更新max值,重置数组,数组的第一项为此键,若等于的话则向数组中添加键

 

  var str = "huahuaveryxihuanbaozihei";
  var obj = {};
  var max = 0,
    arr = [];
  str.replace(/[a-zA-Z]/g, function() {
    var cur = arguments[0];
    if (!(cur in obj)) {
      obj[cur] = 0;
    }
    obj[cur]++;
    if (obj[cur] > max) {
      max = obj[cur];
      arr = [cur];
    } else {
      if (obj[cur] === max) {
        arr[arr.length] = cur;
      }
    }

  })
  arr.zmax = max;
 console.log(obj);
// {h: 4, u: 3, a: 4, v: 1, e: 2…} console.log(arr);
// ["h", "a", zmax: 4]

 

 

4.根据url得到参数值,eg:http://kbs.sports.qq.com/kbsweb/game.html?mid=100000&cid=1467086&app=1.0 => {mid:100000,cid:1467086,app=1.0}

 匹配规则:等号前面非?&=的值,后面非?&=的值

var str = "http://kbs.sports.qq.com/kbsweb/game.html?mid=100000&cid=1467086&app=1.0";
  var reg = /([^?=&]+)=([^?=&]+)/g;
  var obj = {};
  str.replace(reg,function () {
      console.log(arguments);
      obj[arguments[1]] = arguments[2];
  })
  console.log(obj); // {mid: "100000", cid: "1467086", app: "1.0"}

 

5.日期格式的转换,eg: "2015-9-22 13:10:0" -> 2015年09月22日 13时10分00秒

  // 引用模板思路,先上一个模板,然后将模板中对应的位置替换掉就可以了
  // 而对于"2015-9-22 13:10:0",需要提取出年月日时分秒,用正则捕获即可,得到的是数组
  // {0}=>2015,而2015存在捕获的数组里,将其索引和0建立关系即可
  // [{0},{1}...]和[2015,9]一一对应即可,相当于遍历前面的数组将值一一换成后面数组的值
  var model = "{0}年{1}月{2}日 {3}时{4}分{5}秒";
  var timeStr = "2015-9-22 13:10:0";
  var arr = /(\d{4})[-/](\d{1,2})[-/](\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})/.exec(timeStr);
  // ["2015-9-22 13:10:0", "2015", "9", "22", "13", "10", "0", index: 0, input: "2015-9-22 13:10:0"]
  console.log (arr);
  // 将 "1"=>"01",一位数字通过加零变成两位数字
  function oneBitFormatTwoBit(str) {
    return str.length === 1 ? "0" + str : str;
  }
  var newStr = model.replace(/{(\d+)}/g, function() {  
    console.log(arguments)
    // 拿第一次遍历举例,,arguments是["{0}", "0", 0, "{0}年{1}月{2}日 {3}时{4}分{5}秒"]
    // 返回的值肯定是2015,而2015是arr[1],arguments[1]的值是"0",换言之,2015就是arr[+arguments[1] + 1],"0"是字符串需要转换成数字
    // 结果的长度若是一位需要转换成两位
    return oneBitFormatTwoBit(arr[+arguments[1] + 1])

  })
  console.log(newStr);
  // 2015年09月22日 13时10分00秒


6.把一个字符串所有单词的首字母大写

 

  // 其实就是将单词首字母从小写替换成大写
  var str = "huahua loves eating bums";
  var newStr = str.replace(/(?:^|\s)([a-z])/g,function () {
      return arguments[0].toUpperCase();
  })

 

posted @ 2017-02-08 11:56  花.花  阅读(293)  评论(0编辑  收藏  举报