JavaScript中replace方法的回调函数与正则分组提取详解

作者:拾光

时间:2026-10-27

浏览:384

本文详细解析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

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章