Парсер строкового выражения в необходимого вида массив
Всем привет!
Есть строковое выражение, например:
[exmp_1]+[examp_2]+[examp_3]
Мне необходимо спарсить значение в скобках и из этих значений создать следующего вида массив:
["+",["get","exmp_1"],["get","exmp_2"],["get","exmp_3"]]
Мне необходимо понять что выражение именно со сложением, т.е. если например строка [exmp_1]+[examp_2][examp_3], то это некорректно и парсится выражение не должно. Слагаемых может быть сколько угодно.
Вот мой вариант, то что осилил, но не знаю как детектить "+" и его отсутствие. Возможно нужна регулярка немного другая.
function parcingString(text) {
let expression;
const parts = [];
const regex = /\[(.+?)\]/g;
const matches = [...text.matchAll(regex)];
if (matches) {
for (const match of matches) {
parts.push(['get', match[1]]);
}
}
expression = ['+'];
parts.forEach((item) => {
expression.push(item);
});
console.log('expression', expression)
}
let test = '[exmp_1]+[examp_2] + [examp_3]'
parcingString(test);
Возможно у кого-то есть идеи как это можно реализовать? Спасибо за внимание и ответ!
Ответы (1 шт):
Я бы предложил сначала убедиться в том, что строка валидна, а после этого уже проходить по валидному массиву вашим матчером.
Решение можно улучшить, если проверять не инвалидность строки, а валидность, я полагаю, но я сам не сильно умею в RegExp и помог чем смог.
// Если тестить isInvalid на не валидной строке - вернётся true
const isInvalid = new RegExp(/(?<=\])[^\+]/);
const matcher = new RegExp(/(?<=\[).*?(?=\])/g);
function parseString (string) {
return Array.from(string.matchAll(matcher)).reduce(function (acc, item) {
acc.push(["get", item[0]]);
return acc;
}, ["+"]);
}
// Если передать не валидную строку, то getResult вернёт false
function getResult (string) {
return !isInvalid.test(string) && parseString(string);
}
console.log(getResult("[exmp_1]+[examp_2]+[examp_3]"));