使用Java删除不平衡/未分配的括号

我想从字符串中删除所有“unpartnered”或未配对的括号。

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

预期的“括号平衡”字符串应该是

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

我在stackoverflow上看到了一些基于ruby的解决方案。 但是,找不到我可以在java中使用的。

如何在伪代码中完成:

 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 

这适用于您的示例字符串:

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

或者,以更易读的forms:

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

我假设你不想允许嵌套的括号对。 例如,在此字符串中:

 "abc(def(ghi)jkl)mno" 

……应该删除第一个(和最后一个) ,留下这个:

 "abcdef(ghi)jklmno" 

如果你确实想要允许嵌套,那么就没有纯正则表达式解决方案 – 至少不是Java。