正则表达式,用于删除字符串中第二次出现的字符

时间:2013-08-15 17:40:44

标签: javascript

我试图编写一个JavaScript函数,使用正则表达式删除任何第二次出现的字符。这是我的功能

var removeSecondOccurrence = function(string) {
return string.replace(/(.*)\1/gi, '');
}

它只删除连续发生。我想要删除非连续的一个。例如,papirana应该成对。

请帮忙

4 个答案:

答案 0 :(得分:4)

非正则表达式解决方案:

 "papirana".split("").filter(function(x, n, self) { return self.indexOf(x) == n }).join("")

Regexp代码很复杂,因为JS不支持lookbehinds:

str = "papirana";
re = /(.)(.*?)\1/;
while(str.match(re)) str = str.replace(re, "$1$2")

或第一种方法的变体:

"papirana".replace(/./g, function(a, n, str) { return str.indexOf(a) == n ? a : "" })

答案 1 :(得分:1)

使用零宽度前瞻断言,你可以做类似的事情

"papirana".replace(/(.)(?=.*\1)/g, "")

返回

"pirna"

这些字母当然是相同的,只是顺序不同。

传递字符串的反向并使用结果的反向,你可以得到你所要求的。

答案 2 :(得分:0)

这是你用循环做的方法:

var removeSecondOccurrence = function(string) {
    var results = "";
    for (var i = 0; i < string.length; i++)
        if (!results.contains(string.charAt(i)))
            results += string.charAt(i);
}

基本上:对于输入中的每个字符,如果您还没有看过该字符,请将其添加到结果中。至少清晰可读。

答案 3 :(得分:0)

米歇尔说的话。

事实上,我强烈怀疑使用正则表达式无法完成。或者更确切地说,你可以反转字符串,删除除第一次出现之外的所有字符串,然后再次反转,但这是一个肮脏的伎俩,米歇尔建议更好(也可能更快)。

如果你对正则表达式仍然很热......

"papirana".
    split("").
    reverse().
    join("").
    replace(/(.)(?=.*\1)/g, '').
    split("").
    reverse().
    join("")

// => "pairn"

你没有找到除了第一次出现之外的所有事情而没有完全翻转的原因有两个:

  • JavaScript没有lookbehinds,只有lookaheads
  • 即使它确实如此,我认为任何正则表达式都不允许使用可变长度的外观。