Как я могу использовать регулярные выражения для замены переменных по их значению в строке расчета? - PullRequest
1 голос
/ 17 января 2020

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

Чтобы не заменять только часть для переменной (например, если Я определил «m» и «m1», я не хочу заменять m в «m1» значением «m»), я должен соблюдать следующие условия:

  • Перед именем переменной есть либо открывающая скобка, либо операция

  • После имени переменной есть либо закрывающая скобка, либо операция

Пробелы удаляются, когда я получаю расчет (я еще не включил эту функцию)

Для этого я сделал следующий код:

for (var i = 0; i < names.length; i++) 
{
    regex = "(\+|\-|\*|\/|\()" + names[i].value + "(\+|\-|\*|\/|\))"
    replacement = "$1" + values[i].value + "$2"
    calculation = calculation.replace(regex, replacement)
}

Например, для переменной 'm' я получаю регулярное выражение: (\+|\-|\*|/|\()m(\+|\-|\*|/|\))

Проблема в том, что ничего не найдено (я пробовал с (m+n+x)). Я знаю, что проблема связана с регулярным выражением, но я не могу ее найти.

1 Ответ

1 голос
/ 17 января 2020

Ваш regex рассматривается не как регулярное выражение, а скорее как обычное string.

Вместо этого превратите его в new RegExp(). Обратите внимание, что один \ в вашей строке шаблона будет удален (так как это стандартный escape-символ), поэтому вам нужно будет "дважды экранировать" их.

const names =  [{value: "a"}, {value: "b"}];
const values = [{value:  1 }, {value:  5 }];
let calculation = "(a+b)";

for (var i = 0; i < names.length; i++) 
{
    const pattern = "(\\+|\\-|\\*|\\/|\\()" + names[i].value + "(\\+|\\-|\\*|\\/|\\))";
    const regex = new RegExp(pattern);
    const replacement = "$1" + values[i].value + "$2"
    calculation = calculation.replace(regex, replacement)
}

console.log(calculation);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...