有很多这样的帖子,我找到了一些解决方案,但并不完美。其中之一:
"aabbhahahahahahahahahahahasetsetset".replace(/[^\w\s]|(.+)\1+/gi, '$1')
结果是:
abhahahahahahaset
我想得到结果:
abhaset
这该怎么做 ?
有很多这样的帖子,我找到了一些解决方案,但并不完美。其中之一:
"aabbhahahahahahahahahahahasetsetset".replace(/[^\w\s]|(.+)\1+/gi, '$1')
结果是:
abhahahahahahaset
我想得到结果:
abhaset
这该怎么做 ?
.+
是贪婪的。它需要尽可能多的时间。那是ha
s 的一半,因此\1
可以匹配下半部分。使重复不贪婪应该可以解决问题:
/[^\w\s]|(.+?)\1+/gi
顺便说一句,i
这里并没有改变任何东西。
要摆脱嵌套重复(例如转换aaBBaaBB
为aB
(通过aaBB
或aBaB
)),只需多次运行替换,直到结果不再改变。
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')