pfan123/Articles

正则replace方法

Opened this issue · 0 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"

正则表达式
RegExp 代码中的代码
正则表达式30分钟入门教程