2016-10-16 3 views
0

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

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

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

+0

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

+0

Вам действительно нужно вставить '*' в соответствующие места. Вместо того, чтобы использовать 'eval' (что было бы большой проблемой, если вы позволяете людям вводить все, что угодно хотите), рассмотрели ли вы реализацию более ограниченного парсера? Как регулярное выражение, но более подробно. С этим вы можете включить usag e круглых скобок, указывающих на умножение как часть кода синтаксического анализа. Кажется, [jison] (http://zaa.ch/jison/) является хорошим (у него даже есть пример калькулятора). – JAB

ответ

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") && curr == "(") { 
 
      return prev += "*("; 
 
     }else{ 
 
      return prev += curr; 
 
     } 
 
     
 
    },""); 
 

 
console.log(resultString);

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