字符串的replace方法总结

语法

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

参数详解:

  1. regexp (pattern)

一个RegExp 对象或者其字面量。该正则所匹配的内容会被第二个参数的返回值替换掉。

  1. substr (pattern)

一个将被 newSubStr 替换的 字符串。其被视为一整个字符串,而不是一个正则表达式。仅第一个匹配项会被替换。

  1. newSubStr (replacement)

用于替换掉第一个参数在原字符串中的匹配部分的字符串。该字符串中可以内插一些特殊的变量名。参考下面的使用字符串作为参数。

  1. function (replacement)

一个用来创建新子字符串的函数,该函数的返回值将替换掉第一个参数匹配到的结果。参考下面的指定一个函数作为参数。

返回值: 返回一个部分或全部匹配由替代模式所取代的新的字符串。

描述:
该方法并不改变调用它的字符串本身,而只是返回一个新的替换后的字符串。
在进行全局的搜索替换时,正则表达式需包含 g 标志。

使用字符串作为参数

替换字符串可以插入下面的特殊变量名:

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

指定一个函数作为参数

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

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

实例

例1
简单的字符串替换:

    let reg = /sentence/;
    let str = 'This is a simple centence.';
    str = str.replace('centence', 'sentence'); // 普通字符串替换
    console.log(str); // This is a simple sentence.
    
    str = str.replace(reg, 'example');
    console.log(str); // This is a simple example.
复制代码

例2
本例提供的代码来确保匹配字符串大写字符的正确:

    let text = "javascript Tutorial";
    let txt = text.replace(/javascript/i, "JavaScript");
    console.log(txt); // Javascript Tutorial
复制代码

例3
在本例中,我们将把 “Doe, John” 转换为 “John Doe” 的形式:

    let n = "Doe   ,  John";
    let nn = n.replace(/(\w+)\s*,\s*(\w+)/, "$2 $1");
    console.log(nn); // John Doe
复制代码

例4
所有的双引号替换单号:

    let e = '"aa", "ab" , "bb"';
    let ee = e.replace(/"([^"]*)"/g, "'$1'");
    console.log(ee); // 'aa', 'ab', 'bb'
复制代码

例5
使用字符串作为参数:

    var st = 'abcdefg';
    var reg1 = /(c)de/g;
    st = st.replace(reg1, '$$d'); //这里括号包裹的c被$替换了,然后再替换整个匹配到的cde
    console.log(st); // ab$dfg
复制代码

例6
把字符串中的单词首字母大写, 可以进行如下操作

方法1:

    let str = 'hello world 000 ___',
        reg = /(\w)(\w*)/g;
    let res = str.replace(reg, function (match, p1, p2, offset, str) {
        console.log('match:', match, 'p1:', p1, 'p2:', p2, 'offset:', offset, 'str:', str);
        return p1.toUpperCase() + p2;
    });
    console.log('res:', res);
复制代码

打印值如下:

match: hello p1: h p2: ello offset: 0 str: hello world 000 ___
match: world p1: w p2: orld offset: 6 str: hello world 000 ___
match: 000 p1: 0 p2: 00 offset: 12 str: hello world 000 ___
Vmatch: ___ p1: _ p2: __ offset: 16 str: hello world 000 ___
res: Hello World 000 ___
复制代码

方法2:

    let s = 'aaa bbb ccc 000 ___';
    let ss = s.replace(/\b\w+\b/g, function (word) {
        return word.substring(0, 1).toUpperCase() + word.substring(1);
    });
    console.log(ss); // Aaa Bbb Ccc 000 ___
复制代码

例7
掩码手机号

    // 假设我们有一个手机号
    let tel = '13194099515',
	r = '',
	tmp = '****';
复制代码

方法1:

    r = tel.replace(/\d{4}(?=\d{4}$)/g, tmp); // 第一个参数是正则(正则表示匹配末尾的四个数字前的4个数字)
    console.log(r); // 131****9515
复制代码

方法2:

    r = tel.replace(/(\d{3})(\d{4})/g, '$1' + tmp); // 第一个参数是正则
    console.log(r); // 131****9515
复制代码

方法3:

    r = tel.replace(tel.slice(3, -4), tmp); // 第一个参数是字符串
    console.log(r); // 131****9515
复制代码

方法4:

    r = tel.replace(/(\d{3})(\d{4})(\d{4})/g, function(match, p1, p2, p3) {
	return p1 + tmp + p3;
    });
    console.log(r); // 131****9515
复制代码

掩码手机号方法1的理解参考:

正则表达式中?=和?:和?!的理解(blog.csdn.net/csm0912/art…)

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享