输入50a6we8y20x 输出50个a,6个we,8个y,20个x
Sunny-117 opened this issue · 5 comments
Sunny-117 commented
输入50a6we8y20x 输出50个a,6个we,8个y,20个x
weirong111 commented
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;
}
elephantGQ commented
var extendsString = (str) => str.replace(/(\d+)([a-z]+)/g, (_, $1, $2) => $2.repeat(parseInt($1)));
bearki99 commented
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;
}
Tylermeek commented
参照上面的回复
进行一定的参数解释,方便理解
// 主要难点在于如何巧用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));
veneno-o commented
// 这道题最正确的解法应该是正则
function print(str){
return String(str).replace(/(\d+)([a-zA-Z]+)/g,function(_, number, string){
return string.repeat(number);
})
}