将左括号与相应的右括号匹配

时间:2012-02-02 18:44:11

标签: java regex

我正在使用java作为我的程序
假设我有一个像这样的字符串

xx(yyzz(iijj))qq((kkll)(gghh))

我是否可以使用正则表达式单独匹配xx(yyzz(iijj))qq((kkll)(gghh))

2 个答案:

答案 0 :(得分:7)

简单的答案是否定的,没有办法只使用正则表达式。只需遍历字符串并将打开的括号推到堆栈上即可。点击括号时弹出。如果您尝试弹出或完成并且堆栈不为空,则它无效。

您也可以通过删除'('和lastIndex of')'的第一个索引来递归地执行此操作,以验证索引'('小于''的索引')

答案 1 :(得分:4)

可以使用正则表达式将嵌套括号匹配到固定级别。但超过2级将变得相当混乱(2已经是,坦白说)。这符合您的示例:

\(([^()]*+|\([^()]*+\))*\)

快速解释:

\(              # match a '(' 
(               # open group 1
  [^()]*+       #   match any chars other than '(' and ')'
  |             #   OR
  \([^()]*+\)   #   match '(...)'
)*              # close group 1 and repeat it zero or more times
\)              # match a '(' 

请参阅ideone.com

上的演示

有一些正则表达式可以匹配任意数量的嵌套(Perl,.NET,PHP),但Java不是其中之一。

但是看看你在问题中发表的评论,我不会用正则表达式来处理这个问题,而是使用正确的解析器(无论是手工制作的解析器还是生成的解析器)。