2010-03-11 117 views
2

我真的需要在正則表達式一些幫助,我工作的一個功能類似JavaScript的正則表達式問題

var x = 0; 

function doMath(myVar){ 

RE = //; // here is the problem 
if(RE.test(myVar)) 
    eval(x+myVar) 
else 
return false; 

} 

我想RE到可以加入到這個數字像

任何數學方程式匹配
EXAMPLE 
+10+20+30 //accepted 
**10 //rejected 
-10- // rejected 
10 // rejected 
%10 //accepted 
*(10+10)-10 //accepted 

請幫我

}

+6

數學方程式不是一種常規的語言(由於括號問題的平衡),因此你不應該試圖用一個正則表達式來解析它。 – Amber 2010-03-11 01:20:40

+0

我該怎麼辦?任何建議? – trrrrrrm 2010-03-11 01:21:46

+3

我同意戴維。如果最終目標是評估表達式,那麼您應該嘗試使用postfix方法和堆棧來評估它。 http://scriptasylum.com/tutorials/infix_postfix/algorithms/postfix-evaluation/index.htm – 2010-03-11 01:22:18

回答

1

怎麼樣只是做有效characte測試rs(以防止一些代碼注入),然後嘗試「評估」 - 它呢?

function doMath(myVar){ 
    if (/^[0-9()%*\/+-]+$/.test(myVar)){ 
     try{ 
      return eval(myVar); 
     }catch(e){} 
    } 
    return false; 
} 
+1

4小時前,當老闆進來時,我只是寫了同樣的信息:P。您應該注意,驗證還會阻止代碼注入(例如,如果文本來自查詢字符串)。 – Kobi 2010-03-11 10:06:35

+0

謝謝@Kobi,加了幾句話,但我不是100%肯定的,它完全防止了代碼注入。 :-)但是我沒有看到任何僅使用0-9和數學運算符的注射。 – YOU 2010-03-11 10:14:15

0

正如在註釋中提到的,算術方程式不是常規的,所以不要使用正則表達式來處理它們。

爲算術表達式編寫一個Context-free grammar,並使用一個解析器生成器(如Jison),該解析器生成器從給定的語法生成JavaScript中的解析器。

一個例子CFG爲mathemical表達

Jison頁面向下滾動到部分「指定語言」。該部分給出了語言語法來解析算術表達式。希望這可以幫助。