Javascript删除字符串中的重复项和顺序
问题描述:
有很多这样的帖子,我找到了一些解决方案,但并不完美。 其中之一: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')
+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