2012-03-27 63 views
2

我想從字符串中刪除所有「未配對」或不配對的括號。使用Java刪除不平衡/未配對的括號

exampleStr = back-pay) zyzhk1219(17) zyzhk1329 zyzhk1595(15) zyzhk1988 zyzhk2004 zyzhk2131) jswioj((testsjkldf 

了預期的 「括號平衡」 的字符串應該是

back-pay zyzhk1219(17) zyzhk1329 zyzhk1595(15) zyzhk1988 zyzhk2004 zyzhk2131 jswiojtestsjkldf 

我看到一些計算器基於Ruby的解決方案。但是,找不到可以在java中使用的一個。

+0

您可以根據您的示例確認您期望的輸出嗎? – assylias 2012-03-27 22:13:46

+0

而你的問題是... – 2012-03-27 22:13:49

回答

4

怎麼可能在僞代碼來完成:

initialize parenLevel = 0 
for each character in string 
    if char is (increment parenLevel 
    if char is) 
     if parenLevel = 0, remove bad paren 
     else, decrement parenLevel 
next 

initialize parenLevel = 0 
for each character in string in reverse 
    if char is) increment parenLevel 
    if char is (
     if parenLevel = 0, remove bad paren 
     else, decrement parenLevel 
next 

它如何在實踐中實施:http://ideone.com/K3s0X

樣品結果:

back-pay zyzhk1219(17) zyzhk1329 zyzhk1595(15) zyzhk1988 zyzhk2004 zyzhk2131 jswiojtestsjkldf 
+1

非常感謝僞代碼和java代碼。在問這個問題之前,我嘗試了一些類似於你的僞代碼的東西,但是,我一直在無限循環中運行一些外圍條件,比如多重嵌套括號。你的java代碼在指出我的錯誤方面非常有幫助。 – Watt 2012-03-28 05:20:54

+0

以爲這可能會讓你感興趣http://stackoverflow.com/questions/9929168/how-to-remove-unbalanced-unpartnered-double-quotes-in-java – Watt 2012-03-29 17:03:12

1

這正常工作對你的榜樣字符串:

s = s.replaceAll("([^()]*(?:\\([^()]*\\)[^()]*)*)[()]", "$1"); 

或者更可讀的形式:

(
    [^()]*   # some non-parentheses 
    (?: 
    \([^()]*\) # a matched pair of parens 
    [^()]*  # some more non-parens 
)* 
) 
[()]    # one unpaired paren 

我假設你不希望允許嵌套雙括號。例如,在此字符串:

"abc(def(ghi)jkl)mno" 

...第一(最後)應該被刪除,離開這個:

"abcdef(ghi)jklmno" 

如果你想允許嵌套,也沒有純粹的正則表達式解決方案 - 至少,不是用Java。