String.prototype.replace

replace()

str.replace(regexp|substr, newSubStr|function[, flags])

replace()是js内建对象String原型上的方法,用于替换字符串中的一部分值并将最终结果作为一个新的字符串返回(不会改变原字符串),我们直接介绍其常用(第一个参数为RegExp)的两种方法。

str.replace(regexp,newSubStr)

当replacement(newSubStr)是一个string时,replacement中某些特殊字符便代表了特殊的含义:

1
2
3
4
5
$$: 代表一个'$'字符串
$&: 代表regexp匹配的子字符串
$`: 代表匹配到的子串儿之前的部分
$': 代表匹配到的子串儿之后的部分
$n or $nn:当n或nn是一个十进制数时,代表正则表达式中匹配到的第n/nn个小括号中的内容

来个栗子:

1
2
3
var str = "[-god-]";
var resul = str.replace(/-([\w]*)-/,"$$:$&:$`:$':$1");
console.log(resul); //[$:-god-:[:]:god]

str.replace(regexp,function)

当replacement(function)是一个function时,replacement中参数列表则默认代表如下含义:

1
2
3
4
5
第一个参数(match or any): 代表regexp匹配的子字符串(同上的$&)
第二个参数(P1 or any):代表正则表达式中匹配到的第一个小括号中的内容
第三个参数(P2 or any):代表正则表达式中匹配到的第二个小括号中的内容,以此类推..
倒数第二个参数(offset or any):代表regexp匹配的子字符串首字符在原字符串的index值
倒数第一个参数(string or any):代表原字符串

function中的arguments默认为以上的参数列表,有几个参数则按顺序将arguments值依次赋给参数。当regexp的参数包含g(global)时,function会执行相应匹配的次数,转换所有匹配到的值。
官方的栗子:

1
2
3
4
5
6
7
8
var str = 'x-x_';
var retArr = [];
str.replace(/(x_*)|(-)/g, function(match, p1, p2) {
if (p1) { retArr.push({ on: true, length: p1.length }); }
if (p2) { retArr.push({ on: false, length: 1 }); }
});
console.log(retArr); //避免的使用for循环,逼格也高

说白这个方法的核心其实是正则尼玛。。。不说了,学正则去