5

javascript字符串方法replace还是比较强大的,做个笔记总结。

第一个参数

replace的第一个参数为字符串或者正则表达式。第二个参数为替换符,或者一个回调函数。

javascript'aadbbbd'.replace('a','1')
//"1adbbbd"
'aadbbbd'.replace(/a/,'1')
//"1adbbbd"

第二个参数

1.第二个参数为特殊符号

$1、$2、…、$99:与正则表达式中的第1~99个子表达式相匹配的文本。其实也可以在1-9之间,加上0前缀。
该符号针对的是分组,所以,没有分组的话,会被当做$n字符来做替换。

$&:(美元符号+连字符):与正则表达式相匹配的子字符串。

$`:(美元符号+切换技能键):位于匹配子字符串左侧的文本。

$':(美元符号+单引号):位于匹配子字符串右侧的文本。

$$:表示$符号。

代码示例:

javascript'中国人民'.replace(/(中国)/g,'($1)')
//"(中国)人民"
'cdab'.replace(/(ab)/g,'$`')
//"cdcd"
'abcd'.replace(/(ab)/g,"$'")
//"cdcd"
'abcdabcd'.replace(/(ab)/g,"[$&]")
//"[ab]cd[ab]cd"
'$1$2wa,test'.replace(/[a-zA-z]/g,'$$');
//"$1$2$$,$$$$"

如果有10个分组,但是我想在匹配第一个分组的后面加个0,怎么办?
也就是说,怎么让js去做10和1的区分?

用事实说话:

javascript'abcdefghijkkkk'.replace(/(a)/g,"$10")
//"a0bcdefghijkkkk"

'abcdabcd'.replace(/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)/g,"$10")
//"jkkkk"

这个有点为难了,但是却难不倒函数啊!

2.第二个参数为函数

如果第二个参数传入函数,那么,正则表达式没有定义捕获组的情况下,默认为三个参数,分别为:matched(匹配子串),匹配下标,原串(originalText)。否则,第2至n个参数对应为捕获组匹配项,倒数的两个参数为:匹配下标,原串(originalText)。

函数的匹配返回值,作为每次的匹配替换值

javascript'123'.replace(/\d/g,function(m1,m2,m3){
  return m3+'#'
})
//"123#123#123#"
'abcdedddabc12323abc'.replace(/[abc]/g,function(matched,index,originalText){
  return matched+'~'
})
//"a~b~c~deddda~b~c~12323a~b~c~"
'abcdedddabc12323abc'.replace(/[abc]/g,function(matched,index,originalText){
  return '~'
})
//"~~~deddd~~~12323~~~"
'abcdeabc'.replace(/[ab]/g,function(matched,index,originalText){
  return '['+index+']';
})
//"[0][1]cde[5][6]c"

接下来,我们来做个题目,要求对一个串的重复部分进行替换处理,比如:abcabcaabbbdd,该串中abc紧接着abca后紧接着a,无论重复多少次,我们都用#替换掉。

javascript//因为有一个捕获组,所以,需要再传递1参数 $1
'abcaabbccccdddabcabcef'.replace(/(\w+)\1+/g,function(matched,$1,index,originalText){
   return '#';
})
//"abc#####ef"

如果只是保留非重复部分,也就是紧连接的aaa,只需要保留a即可。那么我们可以这么改:

javascript'abcaabbccccdddabcabcef'.replace(/(\w+)\1+/g,function(matched,$1,index,originalText){
   return $1;
})
//"abcabccdabcef"

52lidan
2.8k 声望85 粉丝

写代码要有追求