正则表达式平衡括号

Posted

技术标签:

【中文标题】正则表达式平衡括号【英文标题】:Regex to balance parenthesis 【发布时间】:2015-11-04 20:55:42 【问题描述】:

我有一个字符串为“Zinc Oxide (ZnO))”,我需要一个正则表达式来平衡括号,结果应该是“Zinc Oxide (ZnO)”。我对正则表达式的工作不多。有人可以帮我处理正则表达式吗?

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

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

【问题讨论】:

没有实际的正则表达式会为您做到这一点。对不起。 感谢您分享您的想法。所以我应该通过迭代并删除不必要的圆括号来手动进行验证。我说的对吗? @Sasi 请参阅此帖子以获取可能的解决方案:***.com/a/16874430/2516301 【参考方案1】:

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

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

DEMO

演示中有一个\w\w\w,而不是示例中的\\w1,100,因为这种后视语法在Java 中只允许(至少据我所知)。 Lookbehind 是零长度点,因此在大多数正则表达式风格中,lookbehind 块((?&lt;=...)(?=...) 等)不能包含量词(+*?)或间隔(1,2),但在 Java 中,如果间隔是允许的有最小和最大长度(所以只在nmin,max 形式)。

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

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

带输出:

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

【讨论】:

以上是关于正则表达式平衡括号的主要内容,如果未能解决你的问题,请参考以下文章

在javascript中,我需要一个正则表达式来匹配电话号码中的平衡括号 /^([1]0,1)\s?\(?\d3\)?[-\s]?\d 3[-\s]?\d4$/

使用 RegEx 平衡匹配括号

正则表达式

检查正则表达式是不是通过正则表达式有效

正则表达式中 如何取出所有组中的值?

怎么用正则表达式匹配小括号里内容(含括号)?