js replace正则替换

replace() 方法返回一个由替换值替换一些或所有匹配的模式后的新字符串。模式可以是一个字符串或者一个正则表达式,替换值可以是一个字符串或者一个每次匹配都要调用的回调函数。

当第二个参数是字符串时,可以使用特殊变量名

变量名 代表的值
$$ 插入一个 “$”
$& 插入匹配的子串
$` 插入当前匹配的子串左边的内容
$’ 插入当前匹配的子串右边的内容
$n 假如第一个参数是 RegExp对象,并且 n 是个小于100的非负整数,那么插入第 n 个括号匹配的字符串

示例:

1
2
3
4
5
6
7
8
9
10
11
var str="123{{name}}456";
// $$值为$
// 当前正则匹配到的值为 {{name}} ,即$&值为{{name}}
// 第一个括号$1匹配的字符串为 {{ ,第二个括号$2匹配的字符串为 }}
// 匹配的字符串左侧的内容为 123,即$`值为123
// 匹配的字符串右侧的值为 456 ,即$'值为456
str.replace(/(\{\{)\w+(\}\})/,"$1code$2"); // 123{{code}}456
str.replace(/(\{\{)\w+(\}\})/,"$1co$$de$2"); // 123{{co$de}}456
str.replace(/(\{\{)\w+(\}\})/,"$1co$&de$2"); // 123{{co{{name}}de}}456
str.replace(/(\{\{)\w+(\}\})/,"$1co$`de$2"); // 123{{co123de}}456
str.replace(/(\{\{)\w+(\}\})/,"$1co$'de$2"); // 123{{co456de}}456

第二个参数也可以使用函数,函数的参数含义为

变量名 代表的值
match 匹配的子串。(对应于上述的$&。)
p1,p2,… 假如replace()方法的第一个参数是一个RegExp 对象,则代表第n个括号匹配的字符串。(对应于上述的$1,$2等。)
offset 匹配到的子字符串在原字符串中的偏移量(即匹配的第一个字符在原字符串的索引)。
string 被匹配的原字符串。

示例:

1
2
3
4
5
6
7
8
9
var str="123{{name}}456";
var s=str.replace(/(\{\{\s*)\w+(\s*\}\})/, function(match,s1,s2,offset,string) {
console.log(match) // {{name}}
console.log(s1) // {{
console.log(s2) // }}
console.log(offset) // 3
console.log(string) // 123{{name}}456
return s1+"code"+s2
}) // 123{{code}}456