javascript算法 合并两个字符串的重叠部分, 正则获取匹配项 $1 $2 ...

前段时间有个需求,是匹配多个关键词并且设置高亮。

记录一下用到的算法及正则替换。

 

 

1.合并两个字符串的重叠部分

goggle没有搜索到类似算法(非js) ,所以自己写了一个算法(欢迎fork)

例如:输入'123' '345' 输出 '12345'
      输入'789' '678' 输出 '6789'

/**
 * 去重合并关键词
 * @param   {String} k1 关键词1
 * @param   {String} k2 关键词2
 * @returns {String, Boolean} 返回匹配后的新字符串
 * @TODO: 如关键词1是:java 关键词2是va1111 合并成一个新的关键词  java1111
 */

mixinRepeatKeywords(k1, k2, sign) {
    if (k1 === k2 || !k2 || !k1) return false;

    const len1 = k1.length;
    const len2 = k2.length;
    let index = 0;

    // 合并唯一
    for (let i = 1; i < len1; i++) {
        let sub1 = k1.substring(len1 - i, len1); // k1的后几位
        let sub2 = k2.substring(0, i); // k2的前几位

        // 记录匹配上的最后一个位置
        if (sub1 === sub2) {
            index = i;
        }
    }

    // 拼接为一个字符串
    if (index) {
        return k1 + k2.substring(index, len2);
    }

    // 互换以后不再进行递归处理
    if (sign) {
        return false;
    } else {
        // 互换位置
        return this.mixinRepeatKeywords(k2, k1, true);
    }
}

 

2.正则获取匹配项 $1 $2 ...

用处:如匹配'A'与'a' 则使用通用符号'i'与$1,而不用进行多次匹配

// 看一下如何使用$1,表示被捕获的字符串
var str = 'asad sad 123 sd qwe21';
str.replace(/\d+/img, '数字$1数字');
console.log(str); // 'asad sad 数字$1数字 sd qwe数字$1数字'
// 很显然并没有成功,$1 还是$1,那么如何正确使用呢?

var str = 'asad sad 123 sd qwe21';
str.replace(/(\d+)/img, '数字$1数字');
// 外层增加一对小括号 这里就正确的匹配了数字并且用$1 表示原字符串并替换
console.log(str); // 'asad sad 数字123数字 sd qwe数字21数字'
// 在正则里面表示捕获性元组,可以用$1 特殊字符来表示被替换的内容,可以有多个()元组,也就是可以有多个$1,$2

实际使用方法:
const keywords = 'a';
const replaceString = '$1';
let str = 'abcAbc';
str.replace(new RegExp(`(${keywords})`, 'ig'), replaceString);

 

你可能感兴趣的:(前端web,JS)