在java中對於像這個表達式(3 + 2)+ 23/12-(43/54)的正則表達式,其中左括號是創建用戶將能夠把正確的一個如果沒有創建左括號,用戶將不能輸入正確的括號。如果創建了左括號3次,用戶將只能右置括號3次來關閉由左括號打開的表達式。Java科學計算器正則表達式
感謝
在java中對於像這個表達式(3 + 2)+ 23/12-(43/54)的正則表達式,其中左括號是創建用戶將能夠把正確的一個如果沒有創建左括號,用戶將不能輸入正確的括號。如果創建了左括號3次,用戶將只能右置括號3次來關閉由左括號打開的表達式。Java科學計算器正則表達式
感謝
簡而言之,使用標準的正則表達式,這是不可能的。
正則表達式只能匹配所謂的regular languages,並且匹配的嵌套結構需要a more general type的formal language。
見Can regular expressions be used to match nested patterns?
它,但是,很容易做到,你需要用其他的方法是什麼。例如,只需遍歷該字符串一次,然後計算括號:+1
爲'('
和-1
爲')'
。計數結束時會告訴您有多少個開括號:如果計數大於零,允許用戶添加右括號;否則,不要。
這不是真正的東西,你可以用正則表達式來表達。
你需要一個上下文無關文法。
也見這裏:
http://en.wikipedia.org/wiki/Context-free_grammar
下的部分 「良好形成括號」。
那麼我應該如何解決這個問題 – Hope 2013-03-24 11:25:36
使用像這樣的堆棧寫一個小函數: http://newserverside.blogspot.dk/2012/05/check-parentheses -in-string-expression.html 或者寫一個遞歸函數。 – jcmikkelsen 2013-03-24 11:36:42
謝謝你的鏈接解決了我的問題,謝謝 – Hope 2013-03-24 14:37:56
您的最佳選擇是使用詞法分析器和解析器。在Java世界中,最受歡迎的是ANTLR和JavaCC。
首先在Backus-Naur Form [BNF]中爲您的計算器語言建模。然後轉換成您選擇的詞法分析器,並使用解析器來處理結果。
你應該發佈一些代碼讓我們來幫助你,你有什麼嘗試? – BackSlash 2013-03-24 11:15:39
我認爲這個問題不需要代碼,因爲問題在括號裏,如果左括號「(」在表達式中比你可以放「)」一個如果「(」是3倍或更多比你可以放「)」3倍或更多。 – Hope 2013-03-24 11:20:27
它需要代碼,你應該嘗試自己做,然後來到這裏,告訴我們你的代碼中有什麼不起作用,所以我們可以幫你找到解決方案 – BackSlash 2013-03-24 11:26:34