正则表达式平衡括号
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 块((?<=...)
、(?=...)
等)不能包含量词(+*?
)或间隔(1,2
),但在 Java 中,如果间隔是允许的有最小和最大长度(所以只在n
或min,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$/