Javascript - 当重复次数超过2次时删除重复字符

时间:2014-02-03 19:26:45

标签: javascript

正如标题所说。如果字符串中的字母重复次数超过2次,则会删除多余的重复次数。

我有以下代码基于this answer,但它似乎不起作用:

function removeRepeatingLetters (text) {
    return text.replace('^(?!.*([A-Za-z0-9])\1{2})(?=.*[a-z])(?=.*\d)[A-Za-z0-9]+$', '');
}

但它似乎不适用于我的测试字符串:

“簿记员!正在惊叹!loooooooool”

示例字符串的输出应为:

“簿记员!正在惊叹!lool”

我做错了什么?

2 个答案:

答案 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. 匹配至少重复一次的个别角色的实例 - (.)\1{2,}
  2. 然后它会将匹配和第一个子字符串传递给回调函数 - function(match, p1)
  3. 然后它将返回附加到自身的第一个匹配的子字符串作为替换整体匹配的值 - return p1 + p1;
  4. 由于正则表达式末尾的g,它将对所有找到重复字符的实例执行此操作。

    上面的代码适用于您提供的测试字符串(以及我测试过的其他几个;))。如上所述,Oriol的作品,但我认为我会分享另一种选择,因为它让您了解如何使用.replace()的回调。