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
紧接着abc
,a
后紧接着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"
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。