本文深入解析 JavaScript 中 replace 函数的三种参数形式。详细讲解字符串与正则表达式作为第一个参数的区别,重点介绍全局与非全局替换的行为差异。系统梳理替换字符串中 $1-$99、$&、$`、$' 等特殊标记的含义与用法,并通过示例演示。最后阐述当第二个参数为函数时的执行机制及参数规则,结合首字母大写与分数统计两个实战案例,展示 replace 的高级应用技巧。
replace 函数参数概览
replace 函数接收两个参数:第一个参数可以是字符串或正则表达式,第二个参数同样可以是字符串,也可以是函数。
当第一个参数为字符串时,例如 "I am a boy".replace("boy", "girl"),结果输出为 "I am a girl"。本文重点讨论第一个参数为正则表达式的情形。对于正则表达式,是否包含全局标志(//g)决定了替换行为:若为全局匹配,则替换所有符合条件的子串;若非全局匹配,仅替换第一个匹配项。例如:
代码如下:
"Ha Ha".replace(/\b\w+\b/g, "He") // He He
"Ha Ha".replace(/\b\w+\b/, "He") //He Ha
字符串替换与特殊标记符
1. 第二个参数为字符串的情况:
针对正则替换,约定了一组特殊标记符:
1. $i(i:1-99):表示从左到右正则子表达式所匹配的文本。 2. $&:表示与正则表达式匹配的全文本。 3. $`(反引号):表示匹配字符串左边的文本。 4. $'(单引号):表示匹配字符串右边的文本。 5. $$:表示转义字符 $。 下面通过几个示例进行说明:
代码如下:
"boy & girl".replace(/(\w+)\s*&\s*(\w+)/g,"$2 & $1") //girl & boy
"boy".replace(/\w+/g,"$&-$&") // boy-boy
"javascript".replace(/script/,"$& != $`") //javascript != java
"javascript".replace(/java/,"$&$' is ") // javascript is script
回调函数机制与实战应用
2. 第二个参数为函数的情况:
在 ECMAScript 3 中推荐使用函数方式,该特性实现于 JavaScript 1.2。当执行 replace 方法时,每次匹配都会调用该函数,并将返回值作为替换后的新值。
回调函数的参数规定如下:
1. 第一个参数为每次匹配的全文本($&)。 2. 中间参数为子表达式匹配字符串,个数不限($i,i:1-99)。 3. 倒数第二个参数为匹配文本在字符串中的起始下标位置。 4. 最后一个参数表示原始字符串本身。 这就是 replace 函数强大之处所在。理论说明之后,我们通过示例来解决实际问题:
1. 字符串首字母大写处理:
代码如下:
String.prototype.capitalize = function(){
return this.replace( /(^|\s)([a-z])/g , function(m,p1,p2){ return p1+p2.toUpperCase();
} );
};
console.log("i am a boy !".capitalize())
输出:I Am A Boy !
2. 对字符串“张三56分, 李四74分, 王五92分, 赵六84分”的分数进行提取汇总,计算平均分并输出每个人的分数与平均分的差距。
代码如下:
var s = "张三56分, 李四74分, 王五92分, 赵六84分";
var a = s.match(/\d+/g);
var sum = 0;
for(var i = 0 ; i < a.length; i++){
sum += parseFloat(a[i]);
}
var avg = sum / a.length;
function f(){
var n = parseFloat(arguments[1]);
return n + "分" + "(" + ((n > avg) ? ("超出平均分" + (n - avg)) :
("低于平均分" + (avg - n))) + "分)";
}
var result = s.replace(/(\d+)分/g, f);
console.log(result);
输出:
张三56分(低于平均分20.5分), 李四74分(低于平均分2.5分), 王五92分(超出平均分15.5分), 赵六84分(超出平均分7.5分)
JavaScript 的 replace 函数结合正则表达式的高级应用,将展现出更强大的功能。此处不再深入探讨断言等正则高级应用。
出处:http://www.cnblogs.com/whitewolf/