查找字符在字符串中重复的次数,并通过动态数字删除那些重复的字符
我想编写一个接收两个参数的函数:字符串和数字。该函数将返回另一个与输入字符串相似的字符串,但删除了某些字符。该函数将从同一字符的连续运行中删除字符,其中运行的长度大于输入参数。
例如:
"aaab", 2 => "aab"
"aabb", 1 => "ab"
"aabbaa", 1 => "aba"
我做了什么:
function doSomething(string,number) {
let repeatCount = 0
debugger;
for (let i = 0; i < string.length; i++) {
if(string[i] == string[i+1]){
repeatCount++
}
if(repeatCount > number ){
string.replace(string[i],'')
}
}
console.log(string)
}
doSomething('aaab',2)
在console.log(string)打印'aaab',但我希望它打印'aab',因为number是2和焦炭器“a”重复3次。
如果有另一种更好的方法来做到这一点,我会很乐意学习。
回答
如果有其他更好的方法来做到这一点,我会很乐意学习。
您可以使用一种.replace()方法和带有反向引用的正则表达式来匹配连续的字母。然后您可以使用.slice()删除附加字母以使其达到定义的长度,如下所示:
function shorten(string,number) {
return string.replace(/(.)1+/g, m => m.slice(0, number))
}
console.log(shorten("aaab", 2))// => "aab"
console.log(shorten("aabb", 1))// => "ab"
console.log(shorten("aabbaa", 1))// => "aba"
上面的正则表达式将匹配任何字符并将其分组(.)。然后再次检查这个匹配的字符,看它是否使用 重复了一次或多次1+。然后将为每个连续的字母运行调用替换函数,您可以使用.slice().
例如,取字符串aabbaa。正则表达式尝试查找连续运行的字符。该(.)会匹配任何字符,在这种情况下,它发现"a"并把它变成所谓的“1”的“捕获组”。现在,正则表达式试图通过检查分组(即字符“a”)是否跟随它一次或多次来确定“a”后面是否跟有一个或多个“a”字符。这是使用1+. aabbaa这个正则表达式匹配的字符串的第一部分是“aa”,因为我们匹配了“a”,捕获它,发现它与1+. 找到匹配项后,将m => m.slice(0, number)运行该函数。此函数采用匹配 ( m),在本例中为"aa",并返回它的切片版本,给出“a”。然后用返回的值替换我们从原始字符串匹配的“aa”,从而导致“aa”被转换为“a”(注意这个转换不会修改原始字符串,它发生在得到的新字符串中由替换方法返回)。的/g整个字符串在正则表达式装置的末端重复此。结果,我们的正则表达式继续前进并找到“bb”。然后再次调用该函数,但这次m设置为"bb",导致“bb”转换为“b”。最后,我们匹配“aa”,这会导致“aa”转换为“a”。一旦 replace 完成了整个字符串,它返回带有返回值的结果(以及它没有修改的原始字符串部分),因此它给出“aba”