Javascript 获取字符串中的重复字符

Javascript 获取字符串中的重复字符,javascript,regex,string,character,repeat,Javascript,Regex,String,Character,Repeat,我试着把所有的重复都匹配起来。这就是我到目前为止所做的: var str = 'abcabc123123'; var REPEATED_CHARS_REGEX = /(.).*\1/gi; console.log( str.match(REPEATED_CHARS_REGEX) ); // => ['abca', '1231'] 正如您所看到的,匹配结果是['abca','1231',],但我希望得到['abc','123']。有什么办法可以做到这一点吗 第二个问题: 另一件我想做的事

我试着把所有的重复都匹配起来。这就是我到目前为止所做的:

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

console.log( str.match(REPEATED_CHARS_REGEX) ); // => ['abca', '1231']
正如您所看到的,匹配结果是['abca','1231',],但我希望得到['abc','123']。有什么办法可以做到这一点吗

第二个问题:

另一件我想做的事是,可以更改字符串中字符的持续时间,以获得匹配

例如,如果字符串为abcabc,且重复时间设置为2,则应产生['abcabc']。如果设置为3,则应为['abc']

更新

非RegExp解决方案完全可以

好吧,我想我有一个好主意,可以展望零宽度

'abcabc123123'.match(/(.+)(?=\1)/g)
// ["abc", "123"]
'abc123ab12ab'.match(/(.+)(?=(.*?\1){2})/g)
// ["ab"]
这允许它只匹配初始子串,同时确保至少有1个重复

对于的后续示例,可以使用.*?在重复之间留出间隙

'abc123ab12'.match(/(.+)(?=.*?\1)/g)
// ["ab", "12"]
然后,为了找出重复从何处开始并同时使用多个词,可以为捕获组添加一个量词{n}:

'abcabc1234abc'.match(/(.+){2}(?=.*?\1)/g)
// ["abcabc"]
或者,为了只匹配首字母和后面的一些重复,在“展望”中添加量词

'abcabc123123'.match(/(.+)(?=\1)/g)
// ["abc", "123"]
'abc123ab12ab'.match(/(.+)(?=(.*?\1){2})/g)
// ["ab"]
它还可以使用范围量词匹配最小重复次数,而不使用max-{2,}


如果您不想使用正则表达式,可以使用此解决方案:

function test() {
    var stringToTest = 'find the first duplicate character in the string';
    var a = stringToTest.split('');
    for (var i=0; i<a.length; i++) {
        var letterToCompare = a[i];
        for (var j=i+1; j<a.length; j++) {
            if (letterToCompare == a[j]) {
                console.log('first Duplicate found');
                console.log(letterToCompare);
                return false;
            }
        }
    }
}
test()

上面的答案返回的副本比实际的多。第二个for循环会导致问题,不必要。试试这个:

function stringParse(string){
  var arr = string.split("");
  for(var i = 0; i<arr.length; i++){
    var letterToCompare = arr[i];
    var j= i+1;
    if(letterToCompare === arr[j]){
      console.log('duplicate found');
      console.log(letterToCompare);
    }    
  }  
}

true==>找到重复的

您对字符串abc123ab12有什么期望?@M42 Mhh,['ab','12']…您得到'abca'和'1231'的原因是您的正则表达式匹配任何一个字符。后跟任意数量的其他字符。*后跟第一个字符\1。您需要更改括号中的部分以匹配所有第一组字母。