有很多这样的帖子,我找到了一些解决方案,但并不完美。 其中之一:
"aabbhahahahahahahahahahahasetsetset".replace(/[^\w\s]|(.+)\1+/gi, '$1')
结果是:
abhahahahahahaset
我想得到结果:
abhaset
怎么做?
答案 0 :(得分:4)
.+
是greedy。它需要尽可能多。这是ha
的一半,因此\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
的命名对于第一次重复来说有点尴尬,但是你知道......计算机科学中最困难的两个问题是缓存失效,命名事物和逐个错误。
答案 1 :(得分:2)
.+
将匹配最大金额,因此hahahaha
满足(.+)\1
和haha
以及haha
。您希望尽可能匹配最小数量,因此请使用不情愿的量词。
"aabbhahahahahahahahahahahasetsetset".replace(/[^\w\s]|(.+?)\1+/gi, '$1')