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(); })