2012-02-02 100 views
2

我用java我的程序
假设我有一个字符串,如这个匹配左括号为相应的右括号

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

有什么办法在这我可以xx(yyzz(iijj))qq((kkll)(gghh))单独使用匹配正则表达式?

+0

这是功课吗? – 2012-02-02 18:46:25

+0

不,你不能 – user1096188 2012-02-02 18:49:46

+1

我已经看到了它称之为混合公司BF ......但好运气这一点。 BF看起来像一件苦差事。 – 2012-02-02 18:55:14

回答

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不是其中之一。

但看你贴你的问题下的评论,我不是正则表达式处理这个问题,而是一个适当的解析器(无论是手工制作的一个,或产生的)。

+0

这是我第一次尝试这样的事情,我需要做更多的研究:) – 2012-02-02 19:00:39

+0

感谢的例子,但我会考虑你的意见后,修订解析器:) – 2012-02-02 19:07:26

+0

@CedricMamo,好! :) – 2012-02-02 19:07:53

7

简单的答案是否定的,有没有一种方法只使用正则表达式来做到这一点。只需遍历字符串并将打开的括号插入堆栈即可。当你打开封闭的圆括号时弹出。如果您尝试弹出或完成并且堆栈不是空的,那么它是无效的。

您还可以通过删除“(”和lastIndex的“)”的第一个指标验证的指数“(”小于指数“)”

+0

好的谢谢。我喜欢直接的答案。可能需要重新考虑我目前的代码。感谢您的快速回复:) – 2012-02-02 18:55:08

+0

它完成了。实现了你描述的东西,除了我保留了一个计数器而不是堆栈。为每个计数器增加计数器(找到并为每个计数器递减)。如果计数器达到0,这意味着我已经按照我在问题中描述的方式打了一场比赛。谢谢:)我会投你的答案了,但我没有足够的代表尚未:S – 2012-02-02 23:51:36

+0

你应该能够标记一个答案@CedricMamo通过点击给予好评/ downvote下面的复选标记为接受。谢谢。 – 2012-02-03 00:04:16