解读replace的第二个参数为函数
2017-05-02 14:40
253 查看
在js中,str.replace(RegExp,function(args){});第二个参数为函数,为了更好的解释,我在这里把函数里的参数暂作为数组args。
首先明确第一点:args的长度并不固定,它的长度是根据你所传递的正则表达式RegExp所定,具体是怎么确定的后面介绍。
第二点:
我们先让args具体化一下。args = [1,...,args.length,length-2,args.length-1];这里面的数值在此代表着数组的下标而不是内容。
虽然args的长度不确定,但有三个位置的值是可以确定的。这三个位置便是1,args.length,length-2,args.length-1。
也就是参数的第一项,和最后两项,这三个位置分别对应:当前匹配的值,匹配项在字符串中的最小位置,原始字符串。
第三点:
既然有三个位置的值可以确定,那么除此三个参数外,中间的参数是什么?
中间的参数对应着正则表达式中子表达式捕获组的值。如果子表达式匹配成功则将捕获组的值放到中间的参数中,如果没有匹配成功,
那么会用undefined来占位。
来看一个例子:
var str = '<li><a <%=src%>></a><li><a <%=src%>></a>';
var reg = /<%-([\s\S]+?)%>|<%=([\s\S]+?)%>|<%([\s\S]+?)%>|$/g;
str.replace(reg,function(a,b,c,d,e,f){
console.log(a,b,c,d,e,f);
});
分析:
函数中的参数应该有几位?
首先可以确定有三个参数是肯定存在的,然后整个正则表达式有三个子表达式,那么又有三个参数加入进来,之后分析子表达式。每个子表达式各有一个捕获组,所以不需要额外添加参数位置,如果捕获组的个数超出1,则需要添加参数的个数。最后相加3+3为6.参数一共有6位。
我们只看一次的匹配后输出的结果 :
<%=src%> undefined src undefined 7 <li><a <%=src%>></a><li><a <%=src%>></a>
第一个undefined代表第一个子表示没有匹配成功,第三个undefined代表第三个子表示没有匹配成功。
首先明确第一点:args的长度并不固定,它的长度是根据你所传递的正则表达式RegExp所定,具体是怎么确定的后面介绍。
第二点:
我们先让args具体化一下。args = [1,...,args.length,length-2,args.length-1];这里面的数值在此代表着数组的下标而不是内容。
虽然args的长度不确定,但有三个位置的值是可以确定的。这三个位置便是1,args.length,length-2,args.length-1。
也就是参数的第一项,和最后两项,这三个位置分别对应:当前匹配的值,匹配项在字符串中的最小位置,原始字符串。
第三点:
既然有三个位置的值可以确定,那么除此三个参数外,中间的参数是什么?
中间的参数对应着正则表达式中子表达式捕获组的值。如果子表达式匹配成功则将捕获组的值放到中间的参数中,如果没有匹配成功,
那么会用undefined来占位。
来看一个例子:
var str = '<li><a <%=src%>></a><li><a <%=src%>></a>';
var reg = /<%-([\s\S]+?)%>|<%=([\s\S]+?)%>|<%([\s\S]+?)%>|$/g;
str.replace(reg,function(a,b,c,d,e,f){
console.log(a,b,c,d,e,f);
});
分析:
函数中的参数应该有几位?
首先可以确定有三个参数是肯定存在的,然后整个正则表达式有三个子表达式,那么又有三个参数加入进来,之后分析子表达式。每个子表达式各有一个捕获组,所以不需要额外添加参数位置,如果捕获组的个数超出1,则需要添加参数的个数。最后相加3+3为6.参数一共有6位。
我们只看一次的匹配后输出的结果 :
<%=src%> undefined src undefined 7 <li><a <%=src%>></a><li><a <%=src%>></a>
第一个undefined代表第一个子表示没有匹配成功,第三个undefined代表第三个子表示没有匹配成功。
相关文章推荐
- javascript replace()第二个参数为函数时的参数用法
- replace 第二个参数为函数的情况
- js字符串方法replace()的第二个参数为函数讲解
- JavaScript系列:replace()函数(第二个参数为函数)
- JS 关于replace第二个参数是函数
- replace第二个参数为函数的情况
- JS的replace 使用 第二个参数为函数
- [Microsoft][ODBC SQL Server Driver][SQl Server]参数数据类型 text 对于 replace 函数的参数 1 无效。
- SQL中函数 replace 的参数1的数据类型ntext无效的解决方法
- [Microsoft][ODBC SQL Server Driver][SQl Server]参数数据类型 text 对于 replace 函数的参数 1 无效。
- SQL报错“参数数据类型 text 对于 replace 函数的参数 1 无效”
- 对accept函数第二个参数的理解
- 参数数据类型 text 对于 replace 函数的参数 1 无效
- 简化函数调用之六 :Replace Parameter with Explicit Methods(以明确函数取代参数)
- MSSQL报错:参数数据类型 text 对于 replace 函数的参数 1 无效的解决办法
- 关于Linux socket编程之listen函数的第二个参数backlog.
- Javascript string.replace 方法中 函数参数的使用
- 参数返回Oracle 常用函数:nvl/nullif/case when/wm_concat/replace
- 简化函数调用之八 :Replace Parameter with Method(以函数取代参数)
- (一)ghostscript源码分析之interp()函数的第二个参数