2013-10-19 169 views
0

我工作的這個表達式使用正則表達式在java中的數學表達式?

((([(]?[-]?[0-9]*[.]?[0-9]+)+([\/\+\-\*])+)+([0-9]*[.]?[0-9]+[)]?)+[\+\-\*\/]?([0-9]*)*)+ 

我想這能接受像任何表情:(2+2*7)-4+2/(5-3)+2
,我想避免這樣的表達式:(2+3)- or 2+2-(2+3

的目標是從用戶那裏得到的表達並將其分解成令牌,但在此之前我想檢查輸入的有效性。

+1

數學符號主要是上下文無關文法,這是(不是不可能的,但)使用正則表達式非常難以實現。如果令牌與產品不匹配,爲什麼不只是拋出錯誤? –

+1

不要使用正則表達式。使用[表達式樹](http://en.wikipedia.org/wiki/Binary_expression_tree) – Anirudha

+0

所以基本上你想檢查它們是否有正確數量的分隔符('')' ? – hwnd

回答

2

在其最普遍的形式中,regular expressions可以描述爲regular languages。另一方面,數學公式通常形式化爲context-free languages,它是常規語言的超集。該Chomsky hierarchy進行這種區分明確:正規語言是類型3,而上下文的有更普遍的類型2

直觀的,這裏的關鍵區別是,正規語言不能指望,所以他們不能平衡開啓和關閉括號。使用有限狀態自動機可以檢測到規則語言,但只使用有限數量的狀態,因此可能無法追蹤到目前爲止您已經看到多少個開放圓括號,因爲可能會有任意數量的圓括號。

您可能想要調查lexerparser之間的區別。通常你會用前者用正則表達式來將你的流標記爲數字,運算符等,而你會用後者來構建和檢查由這些標記組成的表達式。