Парсер строкового выражения в необходимого вида массив

Всем привет! Есть строковое выражение, например: [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 шт):

Автор решения: peperoneen

Я бы предложил сначала убедиться в том, что строка валидна, а после этого уже проходить по валидному массиву вашим матчером.

Решение можно улучшить, если проверять не инвалидность строки, а валидность, я полагаю, но я сам не сильно умею в 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]"));
→ Ссылка