replace是JS字符串处理函数中最常用的函数之一,由于有正则表达式的支持,replace功能非常强大。同时,使用replace函数对于学习正则表达式非常重要,可以说,熟练掌握了replace函数,JS的正则就很简单了。
一、语法
str.replace(regexp|substr, newSubStr|function)
JavaScript里replace是绑定在字符串原型链上的一个函数,该函数接收两个参数,第一个参数可以是字符串或者正则表达式,描述了需要替换的子字符串;第二个参数则可以是一个字符串或者一个回调函数,用来描述替换值。字符串是不可变对象,该函数不改变原字符串,返回值为替换后的字符串。
二、使用字符串替换一个子串
把字符串中的'ab'子串替换为'xy':
> 'abcd'.replace('ab', 'xy')
> xycd
> 'abcdab'.replace('ab', 'xy')
> xycdab
可以看出,默认情况下仅第一个匹配参数的子串会被替换。如果想替换所有子字符串,则replace的第一个参数应该接收一个正则表达式,并且正则表达式需包含 g
标志:
> 'abcdab'.replace(/ab/g, 'xy')
> xycdxy
三、使用通配符
replace的第二个参数是字符串的时候,可以在字符串中使用一些通配符,这些通配符都是以特殊字符$开头:
变量名 | 代表的值 |
$$ |
插入一个 "$"。 |
$& |
插入匹配的子串。 |
$` |
插入当前匹配的子串左边的内容。 |
$' |
插入当前匹配的子串右边的内容。 |
$n |
假如第一个参数是 |
比如常用的一个场景是,将金额格式化,每三位数用逗号分隔:
> let sText = '123456789.10'
> let reg = /(\d)(\d{3})([,.]|$)/
> while (reg.test(sText)) sText = sText.replace(reg, "$1,$2$3")
> 123,456,789.10
四、使用函数描述替换值
replace的第二个参数是函数的时候,该函数接收多个参数,如下表。
变量名 | 代表的值 |
match |
匹配的子串。(对应于上述的$&。) |
p1,p2, ... |
假如replace()方法的第一个参数是一个 |
offset |
匹配到的子字符串在原字符串中的偏移量。(比如,如果原字符串是 |
string |
被匹配的原字符串。 |
NamedCaptureGroup | 命名捕获组匹配的对象 |
例(来自思否社区的一个问题):给string类型增加一个format方法,格式字符串有2种格式
- my name is {0},age is {1},填充到{0} {1}去,比如 format("张三",28)
- my name is {name},age is {age},那么参数应该是个对象,按照key的值填充到vaule,比如format({name:张三,age:28})
很类似一个模板解析的功能,我们可以使用replace函数来完成这个需求:
String.prototype.format = function () {
let args = typeof arguments[0] === 'object' ? arguments[0] : arguments
return this.replace(/\{(.*?)\}/g, (m, p1) => p1 in args ? args[p1] : m)
}
测试:
let result = 'name: {name}, age: {age}'.format({ name: 'mumaa', age: 25 })
console.log(result)
result2 = 'name: {0}, age: {1}'.format('mumaa', 25)
console.log(result2)
> name: mumaa, age: 25
> name: mumaa, age: 25