字符串替换:replace的使用

eplace是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

你可能感兴趣的:(正则表达式,javascript,开发语言)