2 回答
![?](http://img1.sycdn.imooc.com/54584c910001b8d902200220-100-100.jpg)
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());
![?](http://img1.sycdn.imooc.com/545863f50001df1702200220-100-100.jpg)
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
在反向引用周围使用。
添加回答
举报