我正在研究需要驗證數學表達式的JavaScript應用程序,我不知道如何執行此操作。驗證JavaScript中的數學表達式?
我的語法例子是
(keyword1 + keyword2) * (keyword1/(keyword1 + keyword1))
這裏,keyword1
和keyword2
可以是任意數字,和有效的運營商是標準的加,減,乘,除。
有沒有人有任何想法如何做到這一點,可能使用正則表達式?
我正在研究需要驗證數學表達式的JavaScript應用程序,我不知道如何執行此操作。驗證JavaScript中的數學表達式?
我的語法例子是
(keyword1 + keyword2) * (keyword1/(keyword1 + keyword1))
這裏,keyword1
和keyword2
可以是任意數字,和有效的運營商是標準的加,減,乘,除。
有沒有人有任何想法如何做到這一點,可能使用正則表達式?
簡單soultion是我們可以發送Ajax請求到服務器可能與表達數據庫,如果它返回正確的值沒有錯誤我的表情是其他有效無效
簡單的哈〜
有很多方法可以解決這個問題。我建議你閱讀關於上下文無關文法/語言。這有點簡單(雖然它確實是一個CFG),但瞭解語法和解析技術總是有幫助的。
我應該注意,你在這裏描述的語言是不規則的,所以沒有正則表達式能夠解析它(抽象引理的一個簡單使用證明了這一點)。此外,我建議不要以有意義的方式使用它們 - 它們不是強大的解析工具。
你可以使用解析庫解決更復雜的語法並實現你的簡單情況。如果您尋找的是一個更直接的解決方案,遞歸是你的朋友:
Let's定義一個有效的表達式爲:
expression ::= literal | expression op expression | (expression)
op ::= + | - |/| *
其中literal是一個數字。
想想如何調整的定義可以更改語言,特別是想想如何實現不同可以用不同的策略解決這個問題:左到右的評價,或者相反,等等
由於@davin指出,這不是你可以用正則表達式來分析。但是,您可以使用上下文無關語法來解析它。認識到你需要一個CFG在這裏是一個很大的步驟,但從CFG到分析算法可能有點棘手。
爲了解析這個表達式,我建議使用兩步法,就像在編譯器中找到的方法一樣。首先,你要將標記爲這個字符串變成一組邏輯單元。也就是說,你的字符串
(1 + 6) * 7
轉換成列表
["(", "1", "+", "6", ")", "*", "7"]
有很多方法可以做到這一步。你可以編寫一個手動標記器,或者使用一組正則表達式來分割字符串。此時,您可以檢測到詞彙錯誤,您在此報告該字符串是否包含任何不應存在的內容。例如,字符「,」在任何這些表達式中都沒有業務,您可以在這裏檢測到。
將字符串標記後,您會想要解析標記流以驗證其是否有效,並可選擇爲數學表達式構建適當的內部表示形式。其中最着名的(也是最簡單的)算法是Dijkstra's Shunting-Yard algorithm,您可以在一個小時內輕鬆寫出。如果您對解析這些表達式的算法更重量級感興趣,您應該考慮查看解析器生成器,它能夠處理更復雜的表達式。如果你想做解析客戶端,快速搜索出現this LALR(1) parser generator for JavaScript。如果您想處理服務器上的解析,請考慮查看野牛或ANTLR工具,它們是非常強大的解析器生成器。
希望這會有所幫助!
好的答案謝謝 –
您的語法示例具有不匹配的圓括號。 – nnnnnn