正如标题所说。如果字符串中的字母重复次数超过2次,则会删除多余的重复次数。
我有以下代码基于this answer,但它似乎不起作用:
function removeRepeatingLetters (text) {
return text.replace('^(?!.*([A-Za-z0-9])\1{2})(?=.*[a-z])(?=.*\d)[A-Za-z0-9]+$', '');
}
但它似乎不适用于我的测试字符串:
“簿记员!正在惊叹!loooooooool”
示例字符串的输出应为:
“簿记员!正在惊叹!lool”
我做错了什么?
答案 0 :(得分:7)
尝试
"bookkeepers! are amaazing! loooooooool".replace(/(.)\1{2,}/g, '$1$1')
// "bookkeepers! are amaazing! lool"
RegExp /(.)\1{2,}/
匹配任何单个字符,后跟相同字符两次或更多次。
标志g
可确保您匹配所有匹配项。
然后,用重复的重复字符替换每个匹配项。
请注意,更简单的.replace(/(.)\1+/g, '$1$1')
也应该有效,但有点慢,因为它会进行不必要的替换。
答案 1 :(得分:1)
另一种方式(Oriol的答案很好)这样做是使用回调函数:
function removeRepeatingLetters (text) {
return text.replace(/(.)\1{2,}/g, function(match, p1) {
return p1 + p1;
});
}
这将:
(.)\1{2,}
function(match, p1)
return p1 + p1;
由于正则表达式末尾的g
,它将对所有找到重复字符的实例执行此操作。
上面的代码适用于您提供的测试字符串(以及我测试过的其他几个;))。如上所述,Oriol的作品,但我认为我会分享另一种选择,因为它让您了解如何使用.replace()
的回调。