使用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。