Javascript删除字母重复和字符串序列

时间:2013-04-25 13:02:29

标签: javascript regex

有很多这样的帖子,我找到了一些解决方案,但并不完美。 其中之一:

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

结果是:

abhahahahahahaset

我想得到结果:

abhaset

怎么做?

2 个答案:

答案 0 :(得分:4)

.+greedy。它需要尽可能多。这是ha的一半,因此\1可以匹配下半部分。不经意地重复应该可以做到这一点:

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

顺便说一下,i在这里没有任何改变。

要摆脱嵌套重复(例如将aaBBaaBB转换为aB(通过aaBBaBaB)),只需多次运行替换,直到结果不变更多。

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

var output = "aaBBaaBB";
var input;

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

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

答案 1 :(得分:2)

.+将匹配最大金额,因此hahahaha满足(.+)\1haha以及haha。您希望尽可能匹配最小数量,因此请使用不情愿的量词。

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

http://jsfiddle.net/HQRDg/