2014-11-22 62 views
0

我正在用JavaScript編寫腳本/輸入的Java數學應用程序。 我希望能夠輸入,比如說,x^2,並在發送到JavaScript解析器之前用Java將其替換爲pow(x,2)。我該如何做這種類型的替換?一個代碼片段中可能有多個不同的表達式,這可能是一行或多行。用pow替換var^power(var,power)

+1

Java和JavaScript是不同的語言,幾乎沒有共同之處,除了一些語法他們都從C繼承,不要混淆。 – cdhowie 2014-11-22 05:54:39

+1

@cdhowie我不是。我的Java應用程序使用JavaScript解析器('javax.script.ScriptEngine')來評估JavaScript中輸入的表達式。 – 2014-11-22 05:57:59

+1

我明白了。那麼,最終唯一的方法就是編寫一個能夠識別你的額外運算符的JavaScript解析器。任何小於這個數字的事情都會引起警告,因爲替代品並沒有做正確的事情。例如,如果'x^2'出現在字符串文字中,則不想替換它。 – cdhowie 2014-11-22 05:59:00

回答

0

UPDATE:

我不知道你是多麼的複雜性預期,但如果你希望它能夠處理一些棘手的表情,你還不如用解析庫。


假設您正在討論javascript,並且您正在替換字符串輸入,請執行以下操作。

"x^2".replace(/(.*)\^(\d+)/, "pow($1, $2)") 
+0

我會添加更多的上下文到您的RegExp來處理空格,底片等。 – dandavis 2014-11-22 05:59:42

+1

如果'a^b'出現在字符串文字中怎麼辦? – cdhowie 2014-11-22 05:59:44

+3

如果用戶輸入更復雜的東西,比如'x^0.5'或'(x + y)^(z-4)'怎麼辦? (甚至'x^y^2'。) – nnnnnn 2014-11-22 06:00:10

0

試試這個: 更新:有可能某些情況下

var re = /(?![\+\-\*\/\(\)\^\s])([a-zA-Z0-9]+)\^([a-zA-Z0-9]+)/gm; 
var str = 'w*x^2 +5^9'; 
var subst = 'pow($1,$2)'; 

var result = str.replace(re, subst); 

live demo

,更好的爲數學運算參考。 http://mathjs.org/

例如&輸出

// expressions 
math.eval('1.2 * (2 + 4.5)');  // 7.8 
math.eval('5.08 cm to inch');  // 2 inch 
math.eval('sin(45 deg)^2');  // 0.5 
math.eval('9/3 + 2i');   // 3 + 2i 
math.eval('det([-1, 2; 3, 1])'); // -7 
+1

如果輸入是'y^3 + x^2',該怎麼辦?問題是「在一個代碼片段中可能有多個不同的表達式」。 – nnnnnn 2014-11-22 06:03:22

+0

並且32 * x^2應該變成32 * pow(x,2),而不是pow(32 * x,2)。 – 2014-11-22 06:05:16

+0

'a ^(b^c)'或'(a^b)^ c'怎麼樣?祝好運使用正則表達式正確地完成這些替換。 – cdhowie 2014-11-22 06:07:04

3

你應該用叉子叉esprima JS解析器以適當的優先級添加^操作人員等,然後走了解析樹,發現它被使用,並做詞彙代換。此鏈接可能有用:http://ariya.ofilabs.com/2011/08/math-evaluator-in-javascript-part-2.html。不太清楚你將如何從你的Java程序中調用這個函數,但我相信你能弄清楚。

或者,http://mathjs.org/中的解析器顯然已經支持^,所以你可以使用它。或者,有http://silentmatt.com/javascript-expression-evaluator/也似乎支持^。或http://jsep.from.so/,「一個微小的JavaScript表達式分析器」。

相關SO問題:Safe evaluation of arithmetic expressions in Javascript