有很多這樣的帖子,我找到了一些解決方案,但並不完美。 其中之一:Javascript刪除字符串中的重複項和順序
"aabbhahahahahahahahahahahasetsetset".replace(/[^\w\s]|(.+)\1+/gi, '$1')
結果是:
abhahahahahahaset
我希望得到的結果:
abhaset
如何做到這一點?
有很多這樣的帖子,我找到了一些解決方案,但並不完美。 其中之一:Javascript刪除字符串中的重複項和順序
"aabbhahahahahahahahahahahasetsetset".replace(/[^\w\s]|(.+)\1+/gi, '$1')
結果是:
abhahahahahahaset
我希望得到的結果:
abhaset
如何做到這一點?
.+
是greedy。它需要儘可能多的。這是ha
s的一半,因此\1
可以匹配下半年。使得重複ungreedy應該做的伎倆:
/[^\w\s]|(.+?)\1+/gi
順便說一句,在i
不會改變任何東西。
爲了擺脫嵌套重複(例如,經由aaBB
或aBaB
)變換成aaBBaaBB
aB
()只需運行更換多次,直到結果不發生任何變化。
var pattern = /[^\w\s]|(.+?)\1+/g;
var output = "aaBBaaBB";
var input;
do
{
input = output;
output = input.replace(pattern, "$1");
} while (input != output)
我承認的output
的命名是第一次重複有點尷尬,但你知道嗎...在計算機科學中兩個最困難的問題是緩存失效,事物命名和關閉的情況的一個錯誤。
.+
將匹配最大量可能,所以hahahaha
滿足(.+)\1
與haha
和haha
。你想匹配最小可能的數量,所以使用一個不情願的量詞。
"aabbhahahahahahahahahahahasetsetset".replace(/[^\w\s]|(.+?)\1+/gi, '$1')
非常感謝,但m.buettner是第一次:) – mitch 2013-04-25 13:10:26
我們的回答解決您的特定問題。但我想知道,你想要的'abcabcDabcabcD'輸出是什麼。你想要'abcDabcD'還是'abcabcD'?如果存在嵌套重複,那麼最長或最短的重複。 – 2013-04-25 13:09:38
嗯,好問題。我希望你的字符串是abcD – mitch 2013-04-25 13:14:49
好的,然後運行替換,直到它不再改變。 – 2013-04-25 13:16:07