2013-03-24 72 views
1

在java中對於像這個表達式(3 + 2)+ 23/12-(43/54)的正則表達式,其中左括號是創建用戶將能夠把正確的一個如果沒有創建左括號,用戶將不能輸入正確的括號。如果創建了左括號3次,用戶將只能右置括號3次來關閉由左括號打開的表達式。Java科學計算器正則表達式

感謝

+4

你應該發佈一些代碼讓我們來幫助你,你有什麼嘗試? – BackSlash 2013-03-24 11:15:39

+0

我認爲這個問題不需要代碼,因爲問題在括號裏,如果左括號「(」在表達式中比你可以放「)」一個如果「(」是3倍或更多比你可以放「)」3倍或更多。 – Hope 2013-03-24 11:20:27

+2

它需要代碼,你應該嘗試自己做,然後來到這裏,告訴我們你的代碼中有什麼不起作用,所以我們可以幫你找到解決方案 – BackSlash 2013-03-24 11:26:34

回答

4

簡而言之,使用標準的正則表達式,這是不可能的。

正則表達式只能匹配所謂的regular languages,並且匹配的嵌套結構需要a more general typeformal language

Can regular expressions be used to match nested patterns?

它,但是,很容易做到,你需要用其他的方法是什麼。例如,只需遍歷該字符串一次,然後計算括號:+1'('-1')'。計數結束時會告訴您有多少個開括號:如果計數大於零,允許用戶添加右括號;否則,不要。

+0

什麼是解決這個問題的方法你有任何想法的鏈接等 – Hope 2013-03-24 11:22:56

+0

謝謝我試試 – Hope 2013-03-24 11:28:46

1

這不是真正的東西,你可以用正則表達式來表達。

你需要一個上下文無關文法。

也見這裏:

http://en.wikipedia.org/wiki/Context-free_grammar

下的部分 「良好形成括號」。

+0

那麼我應該如何解決這個問題 – Hope 2013-03-24 11:25:36

+0

使用像這樣的堆棧寫一個小函數: http://newserverside.blogspot.dk/2012/05/check-parentheses -in-string-expression.html 或者寫一個遞歸函數。 – jcmikkelsen 2013-03-24 11:36:42

+0

謝謝你的鏈接解決了我的問題,謝謝 – Hope 2013-03-24 14:37:56

0

您的最佳選擇是使用詞法分析器和解析器。在Java世界中,最受歡迎的是ANTLR和JavaCC。

首先在Backus-Naur Form [BNF]中爲您的計算器語言建模。然後轉換成您選擇的詞法分析器,並使用解析器來處理結果。