以前对于 string.replace(),我常用于简单的子串替换,对它的一些使用细节不是很清楚,特别正则模式和替换函数的搭配使用,今天好好捋一捋。
replace() 方法返回一个由替换值(replacement)替换部分或所有的模式(pattern)匹配项后的新字符串。
- 模式可以是一个字符串或者一个正则表达式,替换值可以是一个字符串或者一个每次匹配都要调用的回调函数。
- 如果pattern是字符串,则仅替换第一个匹配项(替换全部使用 replaceAll)。
// regexp:匹配正则
// substr:字串
// newSubStr: 用来替换的部分
// function: 更加灵活使用
str.replace(regexp|substr, newSubStr|function)
下面分别介绍4种组合的用法,以及使用场景。
1. string.replace(substr, newSubstr)
将第一个 substr 替换为 newSubstr,举例:
const p = 'I love dog, do you love dog';
console.log(p.replace('dog', 'monkey')); // I love monkey, do you love dog
2. string.replace(substr, replaceFn)
使用 replaceFn 返回值来替换第一个substr,举例:
const p = 'I love dog, do you love dog';
console.log(p.replace('dog', function (substr) {
return "monkey";
}));
3. string.replace(regexp, newSubstr)
第一个使用正则时,newSubstr 中可以使用内置的替换符(占位符),原理是正则中的反向引用。下面的例子演示了如何交换一个字符串中两个单词的位置,这个脚本使用2 代替替换文本。
var str = "John Smith";
var reg = /(\w+)\s(\w+)/g
var res = str.replace(reg, "$2, $1");
console.log(res) // Smith, John
2 分别指向 reg 中的第一个分组 和 第二个分组,支持的占位符如下:
| 变量名 | 代表的值 |
|---|---|
| $$ | 插入一个 "$"。 |
| $& | 插入匹配的子串。 |
| $` | 插入当前匹配的子串左边的内容。 |
| $' | 插入当前匹配的子串右边的内容。 |
| $n | 假如第一个参数是 RegExp对象,并且 n 是个小于100的非负整数,那么插入第 n 个括号匹配的字符串。提示:索引是从1开始。如果不存在第 n个分组,那么将会把匹配到到内容替换为字面量。比如不存在第3个分组,就会用“$3”替换匹配到的内容。 |
| $<Name> | 这里Name 是一个分组名称。如果在正则表达式中并不存在分组(或者没有匹配),这个变量将被处理为空字符串。只有在支持命名分组捕获的浏览器中才能使用。 |
4. string.replace(regexp, replaceFn)
当匹配执行后,replaceFn 就会执行,函数的返回值作为替换字符串。如果为全局匹配模式,那么这个方法将被多次调用。replaceFn 函数的参数稍微有点复杂:
| 变量名 | 代表的值 |
|---|---|
| match | 匹配的子串。(对应于上述的$&。) |
| p1,p2, ... | 假如replace()方法的第一个参数是一个RegExp 对象,则代表第n个括号匹配的字符串。(对应于上述的 |
| offset | 匹配到的子字符串在原字符串中的偏移量。(比如,如果原字符串是 'abcd',匹配到的子字符串是 'bc',那么这个参数将会是 1) |
| string | 被匹配的原字符串。 |
| NamedCaptureGroup | 命名捕获组匹配的对象 |
在使用这个函数时,确保你能准备的计算正则分组的数量,以便计算参数的个数。
(1)将所有单词的第一个字母大写
var str = "john mith 12";
var reg = /(\s?)(\w+)/g
var res = str.replace(reg, function(match, space, letter) {
return space + letter[0].toUpperCase() + letter.substr(1);
});
console.log(res) // John Mith 12
(2) 下划线转驼峰风格
var str = "first_name_111";
var reg = /(\_)(\w)/g
var res = str.replace(reg, function(match, underline, letter) {
return letter.toUpperCase()
});
console.log(res) // firstName111











网友评论