javascript - Regular expression that remove second occurrence of a character in a string - Stack Overflow

I'm trying to write a JavaScript function that removes any second occurrence of a character using

I'm trying to write a JavaScript function that removes any second occurrence of a character using the regular expression. Here is my function

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

It's only removing consecutive occurrence. I'd like it to remove even non consecutive one. for example papirana should bee pairn.

Please help

I'm trying to write a JavaScript function that removes any second occurrence of a character using the regular expression. Here is my function

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

It's only removing consecutive occurrence. I'd like it to remove even non consecutive one. for example papirana should bee pairn.

Please help

Share Improve this question asked Aug 15, 2013 at 17:40 user2686830user2686830 71 silver badge2 bronze badges 2
  • 3 I wouldn't do this with a regex. Iterate over the characters in the string, adding to a new string if it doesn't already contain the char. – Michelle Commented Aug 15, 2013 at 17:43
  • With Michelle's suggestion, an option like this jsFiddle seems to work – Ian Commented Aug 15, 2013 at 17:49
Add a ment  | 

4 Answers 4

Reset to default 4

A non-regexp solution:

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

Regexp code is plicated, because JS doesn't support lookbehinds:

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

or a variation of the first method:

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

Using a zero-width lookahead assertion you can do something similar

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

returns

"pirna"

The letters are of course the same, just in a different order.

Passing the reverse of the string and using the reverse of the result you can get what you're asking for.

This is how you would do it with a loop:

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

Basically: for each character in the input, if you haven't seen that character already, add it to the results. Clear and readable, at least.

What Michelle said.

In fact, I strongly suspect it cannot be done using regular expressions. Or rather, you can if you reverse the string, remove all but the first occurences, then reverse again, but it's a dirty trick and what Michelle suggests is way better (and probably faster).

If you're still hot on regular expressions...

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

// => "pairn"

The reason why you can't find all but the first occurence without all the flippage is twofold:

  • JavaScript does not have lookbehinds, only lookaheads
  • Even if it did, I don't think any regexp flavour allows variable-length lookbehinds

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1744244119a4564844.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信