2012-12-12 137 views
2

我有一個算術表達式 ((20 + 30)-25)/ 5 我想通過使用正則表達式進行驗證。該表達式只能包含整數,浮點數,操作數和括號。javascript驗證算術表達式的正則表達式

我怎樣才能產生正則表達式驗證請幫助或建議的任何其它方式使用JavaScript來驗證字符串。

+0

參見:http://stackoverflow.com/questions/5085524/regular-expression-for-simple-arithmetic-string正則表達式是在大部分語言的相同。 –

+0

你有什麼嘗試?以下鏈接可以幫助您:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp –

+0

@Derek:誤導,即使您說的是「最」。這不可能通過preg引擎或標準正則表達式(因爲它們不能平衡括號),但可以使用Oniguruma(可用於Ruby和其他一些,但不支持JavaScript) – Amadan

回答

2

正如我在評論中所說的,使用一個JavaScript正則表達式是不可能的。但是,您可以使用循環來做到這一點:用原子替換子表達式,重複直到得到原子。如果你不能再減少,而且剩下的不是原子,那麼它就不會被驗證。這實際上與您要評估它的過程幾乎相同(只是跳過抽象語法樹)。您可以搜索\(\d+\)|\d+[-+/*]\d+0取代:

例子:

  • ((20+30)-25)/5
  • ((0)-25)/5
  • (0-25)/5
  • (0)/5
  • 0/5
  • 0
  • 完成

如果未能匹配,並沒有只是0,這是一個失敗。

(評價相驗證,你只需要與實際值,而不是一個虛擬的替身,一切被替換是一樣的)。

0

如果您在括號嵌套中施加最大深度,則只能使用正則表達式執行此操作。否則,該組算術表達式形成上下文無關語言,但不是常規語言。

如果我不得不使用正則表達式,我會使用的方法是寫你的一套算術表達式的語法規則,然後將其轉換成一個正則表達式。

另一種方法是編寫一個遞歸下降解析器,這是一個相當簡單的項目,非常漂亮適用於算術表達式。

1

JavaScript「eval」函數是最好的驗證器。 試着這樣做:

eval("((20+30)-25)5"); 

,你會得到足夠詳細的錯誤描述。