我完全同意你的问题下面的 cmets,这不可能创建正则表达式来平衡字符串中的括号但是如果你的“平衡”字符串和你的例子一样简单,你可以测试这样的东西:
"Zinc Oxide (ZnO))".replaceAll("\\((?!\\w+\\))|(?<!\\(\\w{1,100})\\)","");
DEMO
演示中有一个\w\w\w,而不是示例中的\\w{1,100},因为这种后视语法在Java 中只允许(至少据我所知)。 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)