2011-03-29 37 views
0

在java中的數學運算的表情,我試圖寫一個正則表達式,將一個數學表達式中匹配一個單元,即東西都是運營商定期用括號

我的意思是之間,在表達式像1 + [1 + 2],正則表達式應該匹配前1,然後是[1 + 2]。

我有什麼是* [(? - ?+] \ d +(\ \ d +))(\。[+ \])] *

其中(?[ - +] \ d + (\。\ d +)?)應該匹配任何數量和

(\。[+ \])

應該匹配括號內的東西,但它不工作...它匹配諸如']和''之類的東西。

任何幫助將是巨大的:)

很不幸,這是工作的一部分,所以我只能用基本的Java庫......它也意味着要在正則表達式的練習。我在這裏錯過了什麼基礎?

+9

好平衡括號*** ***不是一個普通的語言。忘記用正則表達式解析數學表達式。 – 2011-03-29 16:30:43

+0

你其實不想用正則表達式來做這件事。你想使用一個標記器來分割你的字符串。 – CanSpice 2011-03-29 16:31:33

+0

@ CanSpice這是2011年,我們使用'.split()'而不是'StringTokenizer' :-) – corsiKa 2011-03-29 16:34:23

回答

2

您找不到正則表達式的匹配圓括號。這是pumping lemma for regular languages(正則表達式所表示的數學對象)不適用於具有匹配的開放/關閉邊界的語言的結果。

您至少需要一個上下文自由分析器。這些可以使用ANTLR或JavaCC構建。

1

你不能用正則表達式來實現這一點。可以使用BNF語法描述算術表達式,該語法可以用於使用諸如JavaCC或ANTLR之類的工具來生成解析器。

下面是一個表達式分析器,我使用的JavaCC實現:

http://dev.eclipse.org/viewcvs/viewvc.cgi/org.eclipse.sapphire/plugins/org.eclipse.sapphire.modeling/src/org/eclipse/sapphire/modeling/el/parser/internal/ExpressionLanguageParser.jj?view=markup&revision=1.6&root=Technology_Project

源是EPL。如果您環顧CVS位置,您還可以找到AST類和評估邏輯。該實現源自爲JSP/JSF規範定義的表達式語言。

0

我回應了其他回答者所說的話(正則表達式不足以解析算術表達式),但推薦使用parboiled而不是ANTLR。

他們甚至可以從a set of calculator examples開始。