本文深入解析JavaScript中String.replace()方法的四种使用场景。涵盖字符串直接替换、全局正则替换、正则捕获组引用($1-$9)以及回调函数模式。重点讲解当正则包含捕获组时,回调函数参数的变化规律,并演示如何利用replace实现字符串trim功能。
replace()方法基础参数说明
ECMAScript规范中定义了String对象的replace()方法。该方法接受两个参数:第一个参数可以是RegExp正则表达式对象或普通字符串,第二个参数可以是替换用的字符串或一个回调函数。接下来将详细阐述这几种组合的具体行为。
字符串直接替换与全局正则替换
第一种情况:两个参数均为字符串。
var text = 'cat, bat, sat, fat';
// 在字符串中找到at,并将at替换为ond,只替换一次
var result = text.replace('at', 'ond');
// "cond, bat, sat, fat"
console.log(result);
第二种情况:第一个参数为RegExp正则对象,第二个参数为字符串。
观察上述示例可知,若不使用全局标志,replace()仅替换第一次出现的匹配项。若要替换所有匹配内容,必须使用带有全局标志(/g)的正则表达式对象。
var text = 'cat, bat, sat, fat';
// 使用/at/g 在全局中匹配at,并用ond进行替换
var result = text.replace(/at/g, 'ond');
// cond, bond, sond, fond
console.log(result);
正则捕获组与替换字符串引用
第三种情况:考虑正则表达式中捕获组的影响。
RegExp拥有9个用于存储捕获组的属性。$1, $2...$9,分别用于存储第一到第九个匹配的捕获组。我们可以访问这些属性,以获取存储的值。
var text = 'cat, bat, sat, fat';
// 使用/(.at)/g 括号为捕获组,此时只有一个,因此所匹配的值存放在$1中
var result = text.replace(/(.at)/g, '$($1)');
// $(cat), $(bat), $(sat), $(fat)
console.log(result);
回调函数模式:无捕获组与有捕获组
第四种情况:第二个参数为回调函数,且正则表达式中不包含捕获组。
var text = 'cat, bat, sat, fat';
// 使用/at/g 匹配字符串中所有的at,并将其替换为ond,
// 函数的参数分别为:当前匹配的字符,当前匹配字符的位置,原始字符串
var result = text.replace(/at/g, function(match, pos, originalText) {
console.log(match + ' ' + pos);
return 'ond'
});
console.log(result);
// 输出
/*
at 1 dd.html:12:9
at 6 dd.html:12:9
at 11 dd.html:12:9
at 16 dd.html:12:9
cond, bond, sond, fond dd.html:16:5
*/
第五种情况:第二个参数为回调函数,且正则表达式中包含捕获组。
var text = 'cat, bat, sat, fat';
// 使用/(.at)/g 匹配字符串中所有的at,并将其替换为ond,
// 当正则表达式中存在捕获组时,函数的参数一次为:模式匹配项,第一个捕获组的匹配项,
// 第二个捕获组的匹配项...匹配项在字符串中的位置,原始字符串
var result = text.replace(/.(at)/g, function() {
console.log(arguments[0] + ' ' + arguments[1] + ' ' + arguments[2]);
return 'ond'
});
console.log(result);
// 输出
/*
cat at 1
bat at 6
sat at 11
fat at 16
cond, bond, sond, fond
*/
实战:使用replace实现字符串trim
上述内容涵盖了replace()方法的所有主要用法。最后,我们将结合replace方法与正则表达式,共同实现一个字符串trim(去除首尾空白)的功能。
(function(myFrame) {
myFrame.trim = function(str) {
// ' hello world '
return str.replace(/(^\s*)|(\s*$)/g, '');
};
window.myFrame = myFrame;
})(window.myFrame || {});
// 测试
var str = ' hello world '
console.log(str.length); // 15
console.log(myFrame.trim(str).length); // 11
本文总结了replace()方法的核心用法,希望能为读者的JavaScript学习提供有益参考。