Sunny-117/js-challenges

输入50a6we8y20x 输出50个a,6个we,8个y,20个x

Sunny-117 opened this issue · 5 comments

输入50a6we8y20x 输出50个a,6个we,8个y,20个x
function extendsString(str: string): string {
  let num = 0;
  let cur = "";
  let res = "";
  for (let i = 0; i < str.length; i++) {
    if (!isNaN(Number(str[i]))) {
      if (cur) {
        res += cur.repeat(num);
        cur = "";
        num = 0;
      }
      num = num * 10 + Number(str[i]);
    } else {
      cur += str[i];
    }
  }
  res += cur.repeat(num);
  return res;
}
var extendsString = (str) => str.replace(/(\d+)([a-z]+)/g, (_, $1, $2) => $2.repeat(parseInt($1)));
function extandStr(str) {
  let num = "";
  let res = "";
  let curStr = "";
  for (let i = 0; i < str.length; i++) {
    if (str[i] >= "0" && str[i] <= "9") num += str[i];
    else if (i + 1 < str.length && str[i + 1] >= "0" && str[i + 1] <= "9") {
      curStr += str[i];
      num = parseInt(num);
      res += curStr.repeat(num);
      console.log(num, curStr);
      num = "";
      curStr = "";
    } else {
      curStr += str[i];
    }
  }
  if(curStr && num){
    res += curStr.repeat(parseInt(num));
  }
  return res;
}

参照上面的回复
进行一定的参数解释,方便理解

// 主要难点在于如何巧用replace第二个参数newvalue
// 其中的特殊参数标识如下:
// $$  直接量符号(就是当做'$$'字符用)
// $&  与正则相匹配的字符串
// $`  匹配字符串左边的字符
// $’  匹配字符串右边的字符
// $1,$2,$,3,…,$n  匹配结果中对应的分组匹配结果

// 想要消除$的影响可以写成函数的返回值,函数具有一下几个参数:
// 第一个参数:匹配到的字符串
// 中间的参数:如果正则使用了分组匹配就为多个否则无此参数
// 倒数第二个参数:匹配字符串的对应索引位置
// 最后一个参数:原始字符串

let str = "20aB6we8y20x";
var extendsString = (str) => {
  let res = str.replace(/(\d+)([a-z][A-Z]+)/g, (_, $1, $2) =>
    // 此处参数分别为_(匹配到的字符串,没有实际用处,仅占位,为了确保后续参数能正确获取到值);
    // $1(分组匹配第一组,匹配到的是数字,至少一个);
    // $2(分组匹配第二组,匹配到的是大小写字母,至少一个)
    $2.repeat(parseInt($1))
  );
  return res;
};

console.log(extendsString(str));
// 这道题最正确的解法应该是正则
function print(str){
    return String(str).replace(/(\d+)([a-zA-Z]+)/g,function(_, number, string){
        return string.repeat(number);
    })
}