本文详细解析JavaScript中String.replace()方法的进阶用法。重点介绍当replacement参数为函数时的处理机制,包括匹配字符串、子表达式、位置及原字符串等参数的传递。通过四个具体示例演示固定参数与非固定参数回调函数的写法,并对比RegExp.exec()与test()方法在获取正则分组时的差异,最后指出传入字符串与正则对象时replace行为的细微区别。
replace方法回调函数参数机制
replace() 方法的 replacement 参数不仅可以是字符串,还可以是一个函数。当使用函数作为替换值时,每次匹配都会调用该函数,其返回值将作为最终的替换文本。该回调函数接收的第一个参数是匹配模式的完整字符串;随后的参数依次对应正则表达式中各个子表达式(括号部分)所匹配的内容,数量取决于子表达式的个数,可能为零个或多个;接着是一个整数参数,表示当前匹配在原字符串 stringObject 中出现的位置索引;最后一个参数则是被操作的原字符串 stringObject 本身。
下文将展示几种 JavaScript 正则表达式配合 replace 方法的实现方式,其中部分技巧(如第二种和第三种方法)在常规资料中较少见。
URL重构的四种实现方式
以下示例旨在通过正则表达式提取 URL 中的两个关键参数,并重构为 URLRewrite 之前的真实 URL 格式。
代码如下:
var reg=new RegExp("(http://www.qidian.com/BookReader/)(\\d+),(\\d+).aspx","gmi");
var url="http://www.qidian.com/BookReader/1017141,20361055.aspx";
//方式一,最简单常用的方式
var rep=url.replace(reg,"$1ShowBook.aspx?bookId=$2&chapterId=$3");
alert(rep);
//方式二 ,采用固定参数的回调函数
var rep2=url.replace(reg,function(m,p1,p2,p3){return p1+"ShowBook.aspx?bookId="+p3+"&chapterId="+p3});
alert(rep2);
//方式三,采用非固定参数的回调函数
var rep3=url.replace(reg,function(){var args=arguments; return args[1]+"ShowBook.aspx?bookId="+args[2]+"&chapterId="+args[3];});
alert(rep3); //方法四
//方式四和方法三很类似, 除了返回替换后的字符串外,还可以单独获取参数
代码如下:
var bookId;
var chapterId;
function capText()
{
var args=arguments;
bookId=args[2];
chapterId=args[3];
return args[1]+"ShowBook.aspx?bookId="+args[2]+"&chapterId="+args[3];
}
var rep4=url.replace(reg,capText);
alert(rep4);
alert(bookId);
alert(chapterId); 正则分组提取的其他方法对比
//除了使用replace方法获取正则表示式的分组外,还可以使用test ,exec方法获取分组,只是手法有所不同而已
代码如下:
var reg2=new RegExp("(http://www.qidian.com/BookReader/)(\\d+),(\\d+).aspx","gmi");
var m=reg2.exec("http://www.qidian.com/BookReader/1017141,20361055.aspx");
var s=""; //获取所有的分组
代码如下:
for (i = 0; i < m.length; i++) {
s = s + m[i] + "\n";
}
alert(s);
bookId=m[2];
chapterId=m[3];
alert(bookId);
alert(chapterId); //使用test方法获取分组
代码如下:
var reg3=new RegExp("(http://www.qidian.com/BookReader/)(\\d+),(\\d+).aspx","gmi");
reg3.test("http://www.qidian.com/BookReader/1017141,20361055.aspx"); //获取三个分组
代码如下:
alert(RegExp.$1);
alert(RegExp.$2);
alert(RegExp.$3);
var str="www.baidu.com";
//str.format("好","q")
str.replace(new RegExp("(\\.)(bai)du","g"),function(){
for(var i=0;i<arguments.length;i++)
{
document.write(arguments[i]+"<br/>");
}
document.write("-------------------------------------------------<br/>");
});
字符串与正则参数替换行为差异两个例子(证明,replace传入正则参数和字符传参数结果不同):
alert("123".replace("1",function(){var un;return un;})); //弹出undefined23
alert("123".replace(new RegExp("1"),function(){var un;return un;})); //弹出23