- 在学习项目构建工具时发现replace函数的第二个参数时常会为一个函数,因此想要做一下总结。
首先,ECMAScript v3规定,
replace()
方法的参数replacement可以是函数而不是字符串;
用法为replace(regexp/substr,函数);
此函数参数的个数需要根据捕获组的个数来定;
content.replace(regexp/substr,function(matchStr,groups,index,sourceStr){
console.log("xxxxxxx");
return result;
})
- matchStr是每次正则匹配到的字符串;
- groups是正则表达式捕获组匹配到的内容,若正则表达式没有捕获组则没有该参数;
- groups代码的是group1、group2、group3…等等参数;
- index是匹配项在字符串中的开始下标;
- sourceStr是原字符串;
- 一定要有一个返回值result且这个返回值替换的是此次匹配到的matchStr,不然会返回一个undefined。
例1:把字符串中的每个数字加一后替换原字符串
(function() {
var str = 'aa12bb0cc789';
console.info("原字符串:"+str);
var newStr = str.replace(/\d/g,function(matchStr,index,sourceStr) {
var result = parseInt(matchStr) + 1;
return result;
});
console.info("替换后的字符串:"+newStr);
})();
运行结果为
原字符串:aa12bb0cc789
替换后的字符串:aa23bb1cc8910
也可以在chrome调试工具中浅试一下:
例2:一个字符串由a-z的字母组成,把连续出现多次的字符串进行压缩。如输入:aaabbbbcccccd 输出:3a4b5cd
function compressRepeatedStr(input) {
var result = input.replace(/([a-z])\1+/g,function(matchStr,group1) {
return matchStr.length + group1;
});
return result;
}
var input = 'aaabbbbcccccd'
var newStr = compressRepeatedStr(input)
- 打印input结果为’aaabbbbcccccd’,打印newStr结果为’3a4b5cd’,如下: