2

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

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

结果是:

abhahahahahahaset

我想得到结果:

abhaset

这该怎么做 ?

4

2 回答 2

4

.+贪婪的。它需要尽可能多的时间。那是has 的一半,因此\1可以匹配下半部分。使重复不贪婪应该可以解决问题:

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

顺便说一句,i这里并没有改变任何东西。

要摆脱嵌套重复(例如转换aaBBaaBBaB(通过aaBBaBaB)),只需多次运行替换,直到结果不再改变。

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

var output = "aaBBaaBB";
var input;

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

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

于 2013-04-25T13:07:40.627 回答
2

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

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

http://jsfiddle.net/HQRDg/

于 2013-04-25T13:09:13.147 回答