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";
});
第二个参数换成一个函数
- 匿名函数执行多少次,取决于正则能在字符串中捕获多少次 -> 正则捕获两次,所以匿名函数也执行两次。
- 每一次执行匿名函数,里面传递的参数值arguments和通过exec捕获到的结果是非常类似的。即使正则有分组,我们同样可以通过arguments获取到分组捕获的内容。
- 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);