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。您需要更改括号中的部分以匹配所有第一组字母。