2016-10-16 2 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'を使用するのではなくて(これは大きな問題になります。あなたがもっと制限されたパーサーを実装するのを見てきましたか?正規表現と同様ですが、より深いところです。 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 
    ) 
} 
関連する問題