猿问

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

我正在尝试找到一个正则表达式,它可以删除字符串中的双字,但我想指定的某些字除外。


这是我正在使用的正则表达式


    setFinal(final) {

        // remove duplicated words and eventual initial/final spaces

        let res = final.replace(/(\b\S.+\b)(?=.*\1)/g, "").trim();


        // ... other code

    }

如果我要指定不考虑的词,我该怎么做?


陪伴而非守候
浏览 136回答 2
2回答

九州编程

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

尚方宝剑之说

对这些词中的任何一个进行否定预测,在一个组内交替。请注意,.匹配任何字符(换行符除外),这可能是不可取的 - 因为您想匹配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在反向引用周围使用。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答