0

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

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

4 回答 4

5

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

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

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

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

'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"]
于 2013-08-11T11:05:39.303 回答
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()
于 2016-05-29T06:16:06.050 回答
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;
}

真 ==> 发现重复

于 2021-01-18T18:36:16.750 回答
0

上面的答案返回比实际更多的重复项。第二个 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);
    }    
  }  
}
于 2016-10-13T00:17:44.377 回答