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