String.prototype.replace高级用法

语法

str.replace(regexp|substr, newSubStr|function)

使用字符串作为参数

变量名 代表值
$$ 插入一个”$”
$& 插入匹配的子串
$` 插入当前匹配的子串左边的内容。
$ 插入当前匹配的子串右边的内容。
$n 如果第一个参数是 RegExp对象,并且 n 是个小于100的非负整数,那么插入第 n 个括号匹配的字符串。提示:索引是从1开始。如果不存在第 n个分组,那么将会把匹配到到内容替换为字面量。列如不存在第3个分组,就会用“$3”替换匹配到的内容。
$<name> 这里Name 是一个分组名称。如果在正则表达式中并不存在分组(或者没有匹配),这个变量将被处理为空字符串。只有在支持命名分组捕获的浏览器中才能使用。

指定一个函数作为参数

你可以指定一个函数作为第二个参数。在这种情况下,当匹配执行后,该函数就会执行。 函数的返回值作为替换字符串。 (注意:上面提到的特殊替换参数在这里不能被使用。) 另外要注意的是,如果第一个参数是正则表达式,并且其为全局匹配模式,那么这个方法将被多次调用,每次匹配都会被调用。

变量名 代表的值
match 匹配的子串。(对应于上述的$&。)
p1,p2, ... 如果replace()方法的第一个参数是一个RegExp 对象,则代表第n个括号匹配的字符串。(对应于上述的String.prototype.replace高级用法2等。)例如,如果是用 /(a+)(+)/ 这个来匹配,p1 就是匹配的 a+p2 就是匹配的 +
offset 匹配到的子字符串在原字符串中的偏移量。(列如,如果原字符串是 abcd ,匹配到的子字符串是 bc ,那么这个参数将会是 1)
string 被匹配的原字符串。
NamedCaptureGroup 命名捕获组匹配的对象

(准确的参数个数依赖于 replace() 的第一个参数是否是一个正则表达式(RegExp)对象,以及这个正则表达式中指定了多少个括号子串,如果这个正则表达式里使用了命名捕获, 还会添加一个命名捕获的对象)

下面的例子将会使 newString 变成 abc - 12345 - #$*%

function replacer(match, p1, p2, p3, offset, string) {
  // p1 is nondigits, p2 digits, and p3 non-alphanumerics
  return [p1, p2, p3].join(  -  );
}
var newString =  abc12345#$*% .replace(/([^d]*)(d*)([^w]*)/, replacer);
console.log(newString);  // abc - 12345 - #$*%

案例:电话号码脱敏

function hidePhoneNum(s) {
    return s.replace(/(1[3-9]d)(d{4})(d{4})/g, function(match, p1, p2, p3){
        return p1 +  ****  + p3
    })
}
let s =  家长电话:13550991234,学生电话:15683173300。请于31日之前来校报道 
console.log(hidePhoneNum(s)) // 家长电话:135****1234,学生电话:156****3300。请于31日之前来校报道

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容