字符串替换:replace的使用

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

假如第一个参数是 RegExp对象,并且 n 是个小于100的非负整数,那么插入第 n 个括号匹配的字符串。提示:索引是从1开始

比如常用的一个场景是,将金额格式化,每三位数用逗号分隔:

> 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()方法的第一个参数是一个RegExp 对象,则代表第n个括号匹配的字符串。(对应于上述的$1,$2等。)例如,如果是用 /(\a+)(\b+)/ 这个来匹配,p1 就是匹配的 \a+p2 就是匹配的 \b+

offset

匹配到的子字符串在原字符串中的偏移量。(比如,如果原字符串是 'abcd',匹配到的子字符串是 'bc',那么这个参数将会是 1)

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

¥赞赏