Javascript 删除字符串中第二个字符的正则表达式

Javascript 删除字符串中第二个字符的正则表达式,javascript,Javascript,我试图编写一个JavaScript函数,使用正则表达式删除任何第二次出现的字符。这是我的功能 var removeSecondOccurrence = function(string) { return string.replace(/(.*)\1/gi, ''); } 它只是删除连续发生的事件。我希望它删除非连续的一个。例如,凤蝶应该变成乳突 请帮助非regexp解决方案: "papirana".split("").filter(function(x, n, self) { return

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

var removeSecondOccurrence = function(string) {
return string.replace(/(.*)\1/gi, '');
}
它只是删除连续发生的事件。我希望它删除非连续的一个。例如,凤蝶应该变成乳突

请帮助非regexp解决方案:

 "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 : "" })
非regexp解决方案:

 "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 : "" })

这是使用循环的方式:

var removeSecondOccurrence = function(string) {
    var results = "";
    for (var i = 0; i < string.length; i++)
        if (!results.contains(string.charAt(i)))
            results += string.charAt(i);
}
var removeSecondOccurrence=函数(字符串){
var结果=”;
对于(变量i=0;i

基本上:对于输入中的每个字符,如果尚未看到该字符,请将其添加到结果中。至少清晰易读。

这是使用循环的方法:

var removeSecondOccurrence = function(string) {
    var results = "";
    for (var i = 0; i < string.length; i++)
        if (!results.contains(string.charAt(i)))
            results += string.charAt(i);
}
var removeSecondOccurrence=函数(字符串){
var结果=”;
对于(变量i=0;i

基本上:对于输入中的每个字符,如果尚未看到该字符,请将其添加到结果中。至少清晰易读。

使用零宽度前瞻断言,您可以执行类似的操作

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

"pirna"
这些字母当然是一样的,只是顺序不同而已


传递字符串的倒数,并使用结果的倒数,您可以得到您想要的结果

使用零宽度前瞻断言,您可以执行类似的操作

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

"pirna"
这些字母当然是一样的,只是顺序不同而已

传递字符串的倒数,并使用结果的倒数,您可以得到您想要的结果

米歇尔说的话

事实上,我强烈怀疑这不能用正则表达式来完成。或者更确切地说,如果你倒转字符串,除去除第一次出现以外的所有内容,然后再倒转,那么你可以这样做,但这是一个肮脏的把戏,Michelle的建议要好得多(而且可能更快)

如果你仍然热衷于正则表达式

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

// => "pairn"
如果没有所有翻页,除了第一次出现之外,您无法找到其他所有翻页的原因有两个:

  • JavaScript没有lookbehind,只有lookahead
  • 即使有,我也不认为任何regexp风格允许可变长度的lookbehind
    • 米歇尔说的话

      事实上,我强烈怀疑这不能用正则表达式来完成。或者更确切地说,如果你倒转字符串,除去除第一次出现以外的所有内容,然后再倒转,那么你可以这样做,但这是一个肮脏的把戏,Michelle的建议要好得多(而且可能更快)

      如果你仍然热衷于正则表达式

      "papirana".
          split("").
          reverse().
          join("").
          replace(/(.)(?=.*\1)/g, '').
          split("").
          reverse().
          join("")
      
      // => "pairn"
      
      如果没有所有翻页,除了第一次出现之外,您无法找到其他所有翻页的原因有两个:

      • JavaScript没有lookbehind,只有lookahead
      • 即使有,我也不认为任何regexp风格允许可变长度的lookbehind

      我不会用正则表达式这样做。迭代字符串中的字符,如果它还没有包含字符,则添加到一个新字符串中。根据Michelle的建议,像这样的选项似乎可以工作,我不会对正则表达式执行此操作。迭代字符串中的字符,如果它还没有包含字符,则添加到新字符串中