把字符串"3[2[ac]3[4[a]1[b]]]"变成 acacaaaabaaaabaaaabacacaaaabaaaabaaaabacacaaaabaaaabaaaab 形式。例如 2[ac],变成 acac,且不用考虑2[3ab],3[a2[ab]]等特殊情况。
解法 1
let string = '3[2[ac]3[4[a]1[b]]]';
let numArr = [];
let leftArr = [];
let j = 0;
function change(item, i) {
if (item === '[') {
//左中括号下标入栈
leftArr.push(Number(i))
//复制次数入栈
numArr.push(Number(string.slice(0, i).match(/\d{1,}/g).pop()))
} else if (item === ']') {
//左中括号下标出栈
let leftPop = leftArr.pop();
//复制次数出栈
let numPop = numArr.pop()
let lsString = `${numPop}[${string.slice(leftPop + 1, i)}]`;
string = string.replace(lsString, string.slice(leftPop + 1, i).repeat(numPop));
//字符串长度可能发生变化
length = string.length;
//根据长度变化,修改循环的下标值
j = j - lsString.length + numPop;
}
}
for (j = 0; j < string.length; j++) {
change(string[j], j)
}
解法 2
此方法支持复制个数大于10的情况
let string = '3[2[ac]3[4[a]1[b]]]';
let reg = /([1-9]{1,})\[([a-z]+)\]/;
function change() {
let result = reg.exec(string);
string = string.replace(result[0], result[2].repeat(result[1]))
}
//直到替换干净为止
while (string.indexOf('[') > -1) {
change(string)
}