我尝试匹配/获取字符串中的所有重复。这就是我到目前为止所做的:
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
解决方案完全没问题!
答案 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 ==> 发现重复