2013-04-25 33 views
2

有很多这样的帖子,我找到了一些解决方案,但并不完美。 其中之一:Javascript删除字符串中的重复项和顺序

"aabbhahahahahahahahahahahasetsetset".replace(/[^\w\s]|(.+)\1+/gi, '$1') 

结果是:

abhahahahahahaset 

我希望得到的结果:

abhaset 

如何做到这一点?

+0

我们的回答解决您的特定问题。但我想知道,你想要的'abcabcDabcabcD'输出是什么。你想要'abcDabcD'还是'abcabcD'?如果存在嵌套重复,那么最长或最短的重复。 – 2013-04-25 13:09:38

+0

嗯,好问题。我希望你的字符串是abcD – mitch 2013-04-25 13:14:49

+0

好的,然后运行替换,直到它不再改变。 – 2013-04-25 13:16:07

回答

4

.+greedy。它需要尽可能多的。这是ha s的一半,因此\1可以匹配下半年。使得重复ungreedy应该做的伎俩:

/[^\w\s]|(.+?)\1+/gi 

顺便说一句,在i不会改变任何东西。

为了摆脱嵌套重复(例如,经由aaBBaBaB)变换成aaBBaaBBaB()只需运行更换多次,直到结果不发生任何变化。

var pattern = /[^\w\s]|(.+?)\1+/g; 

var output = "aaBBaaBB"; 
var input; 

do 
{ 
    input = output; 
    output = input.replace(pattern, "$1"); 
} while (input != output) 

我承认的output的命名是第一次重复有点尴尬,但你知道吗...在计算机科学中两个最困难的问题是缓存失效,事物命名和关闭的情况的一个错误。

2

.+将匹配最大量可能,所以hahahaha满足(.+)\1hahahaha。你想匹配最小可能的数量,所以使用一个不情愿的量词。

"aabbhahahahahahahahahahahasetsetset".replace(/[^\w\s]|(.+?)\1+/gi, '$1') 

http://jsfiddle.net/HQRDg/

+1

非常感谢,但m.buettner是第一次:) – mitch 2013-04-25 13:10:26

相关问题