查找字符在字符串中重复的次数,并通过动态数字删除那些重复的字符

我想编写一个接收两个参数的函数:字符串和数字。该函数将返回另一个与输入字符串相似的字符串,但删除了某些字符。该函数将从同一字符的连续运行中删除字符,其中运行的长度大于输入参数。

例如:

"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”


以上是查找字符在字符串中重复的次数,并通过动态数字删除那些重复的字符的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>