正则replace方法
pfan123 opened this issue · comments
replace 本身是JavaScript字符串对象的一个方法,它允许接收两个参数:
replace([RegExp|String],[String|Function])
-
第1个参数可以是一个普通的字符串或是一个正则表达式
-
第2个参数可以是一个普通的字符串或是一个回调函数
如果第1个参数是RegExp, JS会先提取RegExp匹配出的结果,然后用第2个参数逐一替换匹配出的结果
第2个参数是字符串,对于正则replace约定了一个特殊标记符$:
字符 | 替换文本 |
---|---|
$1、$2、...、$99 | 与 regexp 中的第 1 到第 99 个子表达式相匹配的文本。 |
$& | 与 regexp 相匹配的子串。 |
$` | 位于匹配子串左侧的文本。 |
$' | 位于匹配子串右侧的文本。 |
$$ | 直接量符号。 |
'**人民'.replace(/(**)/g,'($1)')
//"(**)人民"
例外
'**人民**人民'.replace(/(**)/g,'($2)')
//"($2)人民($2)人民" 由于没有组$2, ()代表一个组,此处只有一个组
'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$$,$$$$"
如果第2个参数是回调函数,每匹配到一个结果就回调一次,每次回调都会传递以下参数:
函数参数的规定:
- 1.第一个参数为每次匹配的全文本($&)
- 2.中间参数为子表达式匹配字符串,个数不限.( $i (i:1-99))
- 3.倒数第二个参数为匹配文本字符串的匹配下标位置
- 4.最后一个参数表示字符串本身
函数的匹配返回值,作为每次的匹配替换值。
'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"
var k = "abc123ac222".replace(/(\d+)/g, function(matched, $1, index, originalText){
return Number(matched)+1
})
//abc124ac223
var k1 = "abc123ac222".replace(/(\d+)/g, function(matched, $1, index, originalText){
return Number($1)+1
})
//abc124ac223
题目:要求对一个串的重复部分进行替换处理,比如:abcabcaabbbdd,该串中abc紧接着abc,a后紧接着a,无论重复多少次,我们都用#替换掉
//因为有一个捕获组,所以,需要再传递1参数 $1
'abcaabbccccdddabcabcef'.replace(/(\w+)\1+/g,function(matched,$1,index,originalText){
return '#';
})
//"abc#####ef"
等同于
'abcaabbccccdddabcabcef'.replace(/(\w+)\1+/g, "#")
另外:
'abcaabbccccdddabcabcef'.replace(/(\w+)\1/g,function(matched,$1,index,originalText){
console.log(matched);return '#';
})
//
"abc####d#ef"
如果只是保留非重复部分,也就是紧连接的aaa,只需要保留a即可。那么我们可以这么改:
'abcaabbccccdddabcabcef'.replace(/(\w+)\1+/g,function(matched,$1,index,originalText){
return $1;
})
//"abcabccdabcef"