У меня небольшая проблема. Я работаю над простой программой обработки строк на JavaScript.
Когда вы входите:
"2[a]3[bc]"
Он вернется:
"aabcbcbc"
"3[d2[e]]" > "deedeedee",
"fg2[eset]3[hi]" > " fgesetesethihihi"
Мой код выглядит так:
document.getElementById("myText").value = "String...";
function myFunction() {
var str = document.getElementById("myText").value;
var arr = [];
for (var i = 0; i < str.length; i++) {
var element = str[i]
if (isNaN(element) === false) {
arr += ".repeat(" + element + ")";
} else if (element == "[" || element == "]") {
arr += "'"
} else {
arr += element;
}
}
document.getElementById("answer").value = arr;
}
Ты хоть представляешь, как это исправить?
Теперь он возвращается: .repeat(2)'a'.repeat(3)'bc'
Извините, но меня удивляет, как и почему вы думаете, что добавление строки ".repeat(" к вашему тексту действительно поможет в достижении желаемого результата.
Он нашел где-то код, который использует eval, но не понял, как он работает, поэтому не смог его правильно скопировать.
@AntoniBrulinski примите мой ответ как правильный, если он вам подходит



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Предполагая, что ввод всегда правильный, вы можете использовать регулярное выражение для получения содержимого inner [], а также количества повторений слева. Сначала мы решаем только самый intern [] и продолжаем делать это до тех пор, пока не закончится [] в исходной строке.
function parseFunction(input) {
while(input.includes("[")) {
input = input.replace(/\d+\[[A-Za-z]+\]/g, function(s) {
s = s.replace("]","").split("[");
var newS = "";
for(var i = 0; i < parseInt(s[0]); i++)
newS += s[1];
return newS;
});
}
return input;
}
console.info(parseFunction("2[a]3[bc]"));
console.info(parseFunction("3[d2[e]]"));
console.info(parseFunction("fg2[eset]3[hi]"));Отказ от ответственности: это решение не позволит интерпретировать "3[d2[e]]".
Этого можно добиться с использованием методов объекта Array. Я предоставил пошаговое руководство, как заставить его работать. Также, подробный пример, использующий "2[a]3[bc]" в качестве начальной строки.
разделите массив на ] (используйте метод .split в вашей переменной String)
[
"2[a",
"3[bc",
""
]
сопоставьте каждый элемент с массивом, содержащим как счетчик, так и строку, используйте .map:
[
[
"2",
"a"
],
[
"3",
"bc"
],
[
""
]
]
удалите последний массив, так как он не содержит никакой информации, используйте slice(0, -1):
[
[
"2",
"a"
],
[
"3",
"bc"
]
]
теперь пришло время объединить счетчик и строку для каждого массива, мы делаем это, используя еще одну карту и применяя метод String.repeat. Таким образом, функция, применяемая к каждому элементу (помните, что здесь элементы относятся к типу Array!), Будет выглядеть примерно так: w => w[1].repeat(w[0].match(/\d+/)[0]) ...
w[0].match(/\d+/)[0] позволит выбрать целое число из строки:
[
"aa",
"bcbcbc"
]
наконец, мы объединим каждую строку, чтобы получить результат, используя join(''):
aabcbcbc
Попробуйте заставить его работать по приведенной выше инструкции. Решение ниже ...
const convert = (array) =>
array.split(']')
.map(e => e.split('['))
.slice(0, -1)
.map(w => w[1].repeat(w[0].match(/\d+/)[0]))
.join('')
console.info(convert("2[a]4[bc]"))
console.info(convert("2A[c]e4c[Abc]"))Я внес изменения, чтобы позволить "2[a]3bb[bc]" работать.
Это не работает, если первым символом является нечисловой, например, в OPs fg2[eset]3[hi], ни для вложенного, 3[d2[e]].
Правда, я не понимал, что OP этого хотел.
Описанный вами язык сжатия - это контекстно-свободный язык (или, более конкретно, это контекстно-свободный язык, который не является обычный язык). Невозможно проанализировать такой язык без сохранения дополнительной информации, такой как количество видимых открывающих и закрывающих скобок. Я бы посоветовал отложить компьютер, подумать о проблеме, сделать несколько заметок и только потом вернуться к коду.