js中的replace⽅法
本⽂主要研究字符串⽅法中的replace⽅法,该⽅法主要⽤于将字符串中符合匹配条件的字串替换成其他的字符串,返回替换后的字符串,且原字符串不变。
语法:
var newStr = place(regexp|substr, newSubStr|function)
1. 参数1:匹配条件:可以是正则表达式(regexp)或者字符串(substr)
如果参数1是字符串的话仅匹配⼀次。
var  str = '#home#home'
var pattern1= 'home'
var newStr1 = place(pattern1, 'home1') //得到newStr1的结果为"#home1#home"
如果参数1是正则表达式的话
先考虑没有全局标志g和捕获组的情况:
var  str = '#home#home'
var pattern2= /home/
var newStr2 = place(pattern2, 'home1') //得到newStr2的结果为"#home1#home"
即在没有全局标志g和捕获组的情况下,也是只匹配⼀次。
如果在有全局标志g的情况下:
var  str = '#home#home'
var pattern3= /home/g
var newStr3= place(pattern3, 'home1') //得到newStr3的结果为"#home1#home1"
即在有全局标志g的情况下可以实现全局多次匹配。
如果在有捕获组的情况下:
var str = "John Smith";
var pattern4 = /(\w+)\s(\w+)/;
var newStr4= place(pattern4, 'zyp') //得到newStr4的结果为"zyp"
即针对参数1pattern是捕获组的情况,参数2是字符串,那么该字符串替换第⼀个捕获组,其余的捕获组被空字符串替换,所以当参数
1pattern中存在捕获组的情况下,参数2⼀般是⼀个函数或者特殊变量名(下⾯将要讲到)。
以上考虑的都是参数2是字符串的情况。
2. 参数2:可以是替换字符串( newSubStr)或者是⽅法(function)
如果参数2是替换字符串
上⾯针对参数1的⼏个例⼦都是参数2是字符串的情况,还有⼀种需要注意的情况是:参数2的字符串中可以插⼊以下特殊的变量名:$$ :插⼊⼀个 “$”。
$& :插⼊匹配的⼦串。
$` :插⼊当前匹配的⼦串左边的内容。
$’ :插⼊当前匹配的⼦串右边的内容。
$n :假如第⼀个参数是 RegExp对象,并且 n 是个⼩于100的⾮负整数,那么插⼊第 n 个括号匹配的字符串。索引是从1开始。
最常见的特殊变量名是 $n:
var str = "John Smith";
var pattern5 = /(\w+)\s(\w+)/;
var newStr5= place(pattern5, '$2 $1') //得到newStr5的结果为"Smith John"
如果参数2是函数
该函数可能有以下⼏个参数:
1. match: 每次匹配得到的字符串。如果正则表达式中含有全局标志g的话,那么函数每次匹配到结果函数都会执⾏⼀次,即函数会执⾏
多次,每次匹配得到的字符串就是match。
针对参数match来说,以下例⼦可以进⾏说明:
function styleHyphenFormat(propertyName) {
function upperToHyphenLower(match) {
return '-' + LowerCase();
}
place(/[A-Z]/g, upperToHyphenLower);
}
var styleFormat = styleHyphenFormat('borderLeftWidth') // styleFormat的结果是"border-left-width"
上述例⼦应该即是jquery的css函数中的实现,巧⽤match参数可以有效的避免循环。
2. p1, p2…: 捕获组匹配到的字符串。如果正则表达式中含有捕获组的话,
jsreplace函数针对p1,p2…等参数来说,以下例⼦可以进⾏说明:
function replacer(match, p1, p2, p3, offset, string) {
console.log(match)
return [p1, p2, p3].join(' - ');
}
var newString = 'abc12345#$*%'.replace(/([^\d]*)(\d*)([^\w]*)/, replacer); // newString的结果是 abc - 12345 - #$*%
注意上述例⼦中的match打印出来的结果是‘abc12345#$*%’,即如果pattern中没有全局标志g的话,match参数得到的就是中参数1pattern中包含捕获组情况下得到的数组的第⼀个元素,关于match⽅法的介绍,可以参见我的另外⼀篇博客。
3. offset:每次匹配得到的字符串在源字符串中的偏移量。(⽐如,如果原字符串是“abcd”,匹配到的⼦字符串是“bc”,那么这个
参数将是1)
4. string: 被匹配的原字符串。
总结:对于replace⽅法来说,如果参数1是字符串或者是不带全局标志g的正则表达式,那么只进⾏⼀次匹配;如果参数1中带有全局标志g,那么会进⾏多次匹配,不管参数2是字符串还是函数,都会进⾏多次替换(如果是函数的话是⽤函数的返回值进⾏多次替换);如果参数1中带有捕获组的话,那么⼀般参数2如果是函数,那么函数的p1,p2…等参数对应的就是1,2…等捕获组捕获到的⼦串,参数2如果是字符串的话,$1,$2…等特殊变量对应的就是1,2…等捕获组捕获到的⼦串。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。