在字符串中获取重复字符

时间:2013-08-11 10:25:12

标签: 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']。有任何想法可以实现吗?

第二个问题:

我想到的另一件事是,可以更改持续时间字符串中字符需要匹配的频率......

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

更新

RegExp解决方案完全没问题!

4 个答案:

答案 0 :(得分:4)

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

'abcabc123123'.match(/(.+)(?=\1)/g)
// ["abc", "123"]

这允许它仅匹配初始子串,同时确保至少重复1次。

对于M42的后续示例,可以使用.*?对其进行修改,以便在重复之间留出空白。

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

然后,为了找到重复开始的位置,多次使用,可以为捕获组添加量词({n}):

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

或者,为了使初始与下面的重复次数相匹配,在前瞻中添加量词。

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

它还可以将最小重复次数与范围量词匹配,而不是最大值 - {2,}

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

答案 1 :(得分: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()

答案 2 :(得分:1)

上面的答案会返回比实际更多的重复。第二个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);
    }    
  }  
}

答案 3 :(得分:0)

<块引用>
var duplicateCheck = function(stru) {
    var flag = false;
    for (let o = 0; o < stru.length; o++) {
        for (let p = 0; p < stru.length; p++) {
            if (stru.charAt(o) === stru.charAt(p) && o!==p) {
                flag = true;
                break;
            }
        }
    }
    
    return flag;
}

true ==> 发现重复