语法
str.replace(regexp|substr, newSubStr|function)
参数详解:
- regexp (pattern)
一个RegExp 对象或者其字面量。该正则所匹配的内容会被第二个参数的返回值替换掉。
- substr (pattern)
一个将被 newSubStr 替换的 字符串。其被视为一整个字符串,而不是一个正则表达式。仅第一个匹配项会被替换。
- newSubStr (replacement)
用于替换掉第一个参数在原字符串中的匹配部分的字符串。该字符串中可以内插一些特殊的变量名。参考下面的使用字符串作为参数。
- function (replacement)
一个用来创建新子字符串的函数,该函数的返回值将替换掉第一个参数匹配到的结果。参考下面的指定一个函数作为参数。
返回值: 返回一个部分或全部匹配由替代模式所取代的新的字符串。
描述:
该方法并不改变调用它的字符串本身,而只是返回一个新的替换后的字符串。
在进行全局的搜索替换时,正则表达式需包含 g 标志。
使用字符串作为参数
替换字符串可以插入下面的特殊变量名:
变量名 | 代表的值 |
---|---|
$$ | 插入一个 “$”。 |
$& | 插入匹配的子串。 |
$` | 插入当前匹配的子串左边的内容。 |
$’ | 插入当前匹配的子串右边的内容。 |
$n | 假如第一个参数是 RegExp对象,并且 n 是个小于100的非负整数,那么插入第 n 个括号匹配的字符串。提示:索引是从1开始。如果不存在第 n个分组,那么将会把匹配到到内容替换为字面量。比如不存在第3个分组,就会用“$3”替换匹配到的内容。 |
$ | 这里Name 是一个分组名称。如果在正则表达式中并不存在分组(或者没有匹配),这个变量将被处理为空字符串。只有在支持命名分组捕获的浏览器中才能使用。 |
指定一个函数作为参数
你可以指定一个函数作为第二个参数。在这种情况下,当匹配执行后,该函数就会执行。 函数的返回值作为替换字符串。 (注意:上面提到的特殊替换参数在这里不能被使用。) 另外要注意的是,如果第一个参数是正则表达式,并且其为全局匹配模式,那么这个方法将被多次调用,每次匹配都会被调用。
变量名 | 代表的值 |
---|---|
match | 匹配的子串。(对应于上述的$&。) |
p1,p2, … | 假如replace()方法的第一个参数是一个RegExp 对象,则代表第n个括号匹配的字符串。(对应于上述的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…)