Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

正则replace方法 #4

Open
pfan123 opened this issue May 8, 2017 · 0 comments
Open

正则replace方法 #4

pfan123 opened this issue May 8, 2017 · 0 comments

Comments

@pfan123
Copy link
Owner

pfan123 commented May 8, 2017

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分钟入门教程

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant