正则表达式来平衡括号

时间:2015-08-12 10:02:04

标签: java regex

我有一个字符串为“氧化锌(ZnO)”,我需要一个正则表达式来平衡括号,结果应该是“氧化锌(ZnO)”。我没有太多关于正则表达式的工作。任何人都可以帮我正则表达式吗?

String.replace是解决方案,但我需要一个正则表达式来平衡任何字符串的括号,如示例所示。

对此有任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我完全同意你的问题下面的评论,如果你的字符串“平衡”和你的例子一样简单,就不可能创建正则表达式以平衡字符串中的括号但是你可以测试类似这样的东西:

"Zinc Oxide (ZnO))".replaceAll("\\((?!\\w+\\))|(?<!\\(\\w{1,100})\\)","");

DEMO

演示中有一个\w\w\w,而不是像示例中的\\w{1,100},因为在Java中只允许(至少我知道)lookbehind中的这种语法。 Lookbehind是零长度点,因此在大多数正则表达式中,lookbehind块((?<=...)(?=...)等)不能包含量词(+*?)或间隔({1,2}),但是在Java中,如果间隔具有最小和最大长度(仅限于{n}{min,max}形式),则允许使用。

但正如我上面所说,它只适用于最简单的输入 !!没有嵌套的括号等.Java中的例子:

public class Test {
    public static void main(String[] args) {
        System.out.println("Zinc Oxide (ZnO))".replaceAll("\\((?!\\w+\\))|(?<!\\(\\w{1,100})\\)",""));
        System.out.println("Zinc Oxide ((ZnO))".replaceAll("\\((?!\\w+\\))|(?<!\\(\\w{1,100})\\)",""));
        System.out.println("Zinc Oxide ((ZnO)".replaceAll("\\((?!\\w+\\))|(?<!\\(\\w{1,100})\\)",""));
        System.out.println("Zinc Oxide (ZnO)))".replaceAll("\\((?!\\w+\\))|(?<!\\(\\w{1,100})\\)",""));
        System.out.println("Zinc Oxide (((ZnO))".replaceAll("\\((?!\\w+\\))|(?<!\\(\\w{1,100})\\)",""));
    }
}

带输出:

Zinc Oxide (ZnO)
Zinc Oxide (ZnO)
Zinc Oxide (ZnO)
Zinc Oxide (ZnO)
Zinc Oxide (ZnO)