Как мне выполнить математическую операцию из строки со скобками?

#javascript #math #eval

#javascript #математика #оценка

Вопрос:

Мне трудно выполнять математику с помощью скобок, подобных 7( 7 (7 (7 1) ))(7) . Я занимаюсь eval() своими операциями. Я думал, что решить эту проблему — значит преобразовать это в 7*(7 (7*(7 1)))*(7) . Я пытался

 /(?!*()(()/g
 

чтобы избежать '*(' регулярного выражения и принять '(' метод замены, но я терплю неудачу. Я подумываю о том , чтобы вставить * раньше ( . Как я могу работать 7( 7 (7 (7 1) ))(7) правильно? Я делаю это для проекта калькулятора.

Комментарии:

1. Пожалуйста, обновите свой ответ вашим фактическим кодом (с правильным отступом) и примером выходных данных или ошибок, которые они получают.

2. Вам действительно нужно вставить * в соответствующие места. Вместо того, чтобы использовать eval (что было бы большой проблемой, если вы позволяете людям вводить все, что они хотят), вы рассматривали возможность реализации более ограниченного синтаксического анализатора? Похоже на регулярное выражение, но более глубокое. При этом вы могли бы включить использование круглых скобок для указания умножения как часть кода синтаксического анализа. Кажется, jison хороший (у него даже есть пример калькулятора).

Ответ №1:

Это решение без регулярных выражений. Сначала замените все пробелы пустыми строками. Затем замените «(» на «*(«, только если перед скобками не стоит оператор.

 var testString = ("7( 7 (7 (7 1) ))(7)").split("").filter((e) => e!=" ");
var arr = [" ", "-", "/", "("];

var resultString = testString.reduce(function(prev, curr, i)                               
 {
     if(arr.indexOf(i-1 ? testString[i-1] : "test") amp;amp; curr == "(") { 
           return prev  = "*(";
       }else{
           return prev  = curr;
        }
        
  },"");

console.log(resultString); 

Ответ №2:

 // (expr: string) => number
function evaluate(expr) {
  return eval(
    expr
      .replace(/s /g, '')             // remove spaces
      .replace(/([d|)])(/g, '$1*(') // insert multiplication signs
    )
}