获取字符串中重复的字符

yck*_*art 0 javascript regex string character repeat

我尝试匹配/获取字符串中的所有重复项。这是我到目前为止所做的:

var str = 'abcabc123123';
var REPEATED_CHARS_REGEX = /(.).*\1/gi;

console.log( str.match(REPEATED_CHARS_REGEX) ); // => ['abca', '1231']
Run Code Online (Sandbox Code Playgroud)

如您所见,匹配结果为['abca', '1231'],但我希望得到['abc', '123']. 有什么想法可以实现吗?

第二个问题:

我期望的另一件事是可以更改字符需要在字符串中多久才能匹配的持续时间...

例如,如果字符串是abcabcabc并且重复时间设置为2它应该导致['abcabc']. 如果设置为3它应该是['abc'].

更新

一个非RegExp解决方案是完全可以的!

Jon*_*ski 5

好吧,我认为falsetru有一个零宽度前瞻的好主意。

'abcabc123123'.match(/(.+)(?=\1)/g)
// ["abc", "123"]
Run Code Online (Sandbox Code Playgroud)

这允许它只匹​​配初始子字符串,同时确保后面至少有 1 次重复。

对于M42的后续示例,可以使用 a.*?对其进行修改以允许重复之间的间隙。

'abc123ab12'.match(/(.+)(?=.*?\1)/g)
// ["ab", "12"]
Run Code Online (Sandbox Code Playgroud)

然后,要找到重复使用的位置,{n}可以为捕获组添加一个量词 ( ):

'abcabc1234abc'.match(/(.+){2}(?=.*?\1)/g)
// ["abcabc"]
Run Code Online (Sandbox Code Playgroud)

或者,要仅将初始值与后续的重复次数相匹配,请在前瞻中添加量词。

'abc123ab12ab'.match(/(.+)(?=(.*?\1){2})/g)
// ["ab"]
Run Code Online (Sandbox Code Playgroud)

它还可以将最小重复次数与没有最大值的范围量词匹配—— {2,}

'abcd1234ab12cd34bcd234'.match(/(.+)(?=(.*?\1){2,})/g)
// ["b", "cd", "2", "34"]
Run Code Online (Sandbox Code Playgroud)