2013-04-25 31 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

相關問題