你可能会遇到这种需求:将一段文字内容的相同关键字进行替换,而且按照递增序列进行标记。 比如,我要把这段文字里匹配到的"数据"二次替换成这样"数据i",i就是编号,匹配有n个数据,i就是从1到n的递增标记变量。
需求分析
正则里的替换只能是按指定的规则和参数进行替换,要实现上述需求,第一步得拿到所有匹配的关键字,可以得到n的值;第二步,想办法去遍历这些关键字集合,然后将变量i添加到结果上;
解决方案
根据上面的分析,关键点就是要在用正则替换时可以遍历到所有匹配项。这里需要用到的关键就是js的replace方法,我们一般的用法是像这样:
this.strings = 'sd342fl${key}sfs345k423gs${key}sd333333fk'
var reg = new RegExp((`(${"key"})`), 'gm');
this.strings = this.strings.replace(reg, 'newcontent');
上面的replace方法第二个参数是个字符串,实际上也可以是个函数,像这样:
this.strings = 'sd342fl${key}sfs345k423gs${key}sd333333fk'
var reg = new RegExp((/\$\{(key)\}/), 'gm');
this.strings = this.strings.replace(reg, newcontent);
function newcontent() {
console.table(arguments)
return "ntr";
}
我们看看newcontent函数的参数是什么,看输出结果,比较明显了:
- 第一个参数是与正则匹配到的字符串
- 第二个参数也是匹配到的字符串,不过是子字符串,就是包含在第一个里面的子匹配项
- 第三个参数是第一个参数所在原字符串的索引位置
- 最后一个参数是被匹配的字符串本身
而且最重要的,这个newcontent参数会执行两次,因为匹配的结果有两个,那如果有n个就会执行n次,这就可以满足了前面我们提到的要求:对匹配到的所有关键字进行遍历,并且每次执行这个函数时,返回值就是匹配项要替换的结果值。
其实到这里,答案已经快要出来了,后面的我就不再分析了,直接给代码吧:
var i = 0;
this.strings = 'sd342fl${key}sfs345k423gs${key}sd333333fk'
function increase() {
var nstr;
if (arguments[0] != undefined) {
var re = /^key$/;
if (re.test(arguments[0])) {
nstr = "key" + i;
if (i < 2) {
i++;
} else {
i = 0
}
}
}
return nstr;
}
var reg = new RegExp((`${"key"}`), 'gm');
this.strings = this.strings.replace(reg, increase);
console.log(this.strings)
执行结果如下:
注意看执行结果,已经看到关键字key字符串已经有了递增编号,变成了key0、key1,这个就是我们想要的结果。
最后还是要说一点,这个例子比较简单,如果遇到要分析的字符串内容较多的情况,可以用下面这行代码分析一下就能得到关键字的个数了。
'sd342fl${key}sfs345k423gs${key}sd333333fk'.split(`${"key"}`)
好了,水文一篇到此结束,希望对你有用!更多技术文章请关注我的公众号 字节逆旅
本文使用 mdnice 排版