如何将字符串关键字进行递增编码?

1,193 阅读2分钟

你可能会遇到这种需求:将一段文字内容的相同关键字进行替换,而且按照递增序列进行标记。 比如,我要把这段文字里匹配到的"数据"二次替换成这样"数据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 排版