为了账号安全,请及时绑定邮箱和手机立即绑定

删除字符串上除某些指定的双字以外的双字

删除字符串上除某些指定的双字以外的双字

陪伴而非守候 2021-09-30 10:12:56
我正在尝试找到一个正则表达式,它可以删除字符串中的双字,但我想指定的某些字除外。这是我正在使用的正则表达式    setFinal(final) {        // remove duplicated words and eventual initial/final spaces        let res = final.replace(/(\b\S.+\b)(?=.*\1)/g, "").trim();        // ... other code    }如果我要指定不考虑的词,我该怎么做?
查看完整描述

2 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

如果您想保留单词的第一次出现并删除后续出现,那么它会变得更加复杂。可能有比我想出的更简单的东西,但它确实有效:


function rep()

{

    const final = 'aaa bbb foo ccc bbb bbb bbb bar ddd foo bar aaa bbb';

    let result = final;

    for (;;) {

        let m = result.match(/(\b(?!foo|bar)\S+\b)(?:.+)(\b\1\b)/i);

        if (!m) {

            return result.replace(/\s+/g, ' ').trim();

        }

        let s = m[1];

        let index = m.index;

        /* replace all occurences of s: */

        let regex = new RegExp("\\b" + s + "\\b", "gi");

        result = result.replace(regex, "");

        /* put pack first occurence */

        result = [result.slice(0, index), s, result.slice(index)].join('');

    }

}


console.log(rep());


查看完整回答
反对 回复 2021-09-30
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

对这些词中的任何一个进行否定预测,在一个组内交替。请注意,.匹配任何字符(换行符除外),这可能是不可取的 - 因为您想匹配words,可能更好地使用[a-z]or \S(非空白字符)或类似的东西。


例如,以下删除重复的单词(只留下任何特定单词的最后一次出现),除了始终保留的foo和出现bar。


const final = 'aaa bbb foo ccc bar ddd foo bar aaa bbb';

let res = final.replace(/(\b(?!foo|bar)\S+\b)(?=.*\b\1\b)/gi, "").trim();

console.log(res);

确保\b在反向引用周围使用。


查看完整回答
反对 回复 2021-09-30
  • 2 回答
  • 0 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信