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

Java 将左括号与相应的右括号匹配,java,regex,Java,Regex,我正在使用java编写我的程序 假设我有这样一个字符串 xx(yyzz(iijj))qq((kkll)(gghh)) 有什么方法可以分别使用正则表达式来匹配xx(yyz(iijj))和qq((kkll)(gghh))。只需遍历字符串并将开括号推到堆栈上。当你点击闭合圆括号时弹出。如果尝试弹出或完成,并且堆栈不是空的,则堆栈无效 您还可以通过删除“(”的第一个索引和“')的最后一个索引来递归地执行此操作,验证“(”的索引是否小于“')”的索引。您可以使用正则表达式匹配嵌套括号,直到达到一个固定级

我正在使用java编写我的程序
假设我有这样一个字符串

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

有什么方法可以分别使用正则表达式来匹配
xx(yyz(iijj))
qq((kkll)(gghh))
。只需遍历字符串并将开括号推到堆栈上。当你点击闭合圆括号时弹出。如果尝试弹出或完成,并且堆栈不是空的,则堆栈无效

您还可以通过删除“(”的第一个索引和“')的最后一个索引来递归地执行此操作,验证“(”的索引是否小于“')”的索引。

您可以使用正则表达式匹配嵌套括号,直到达到一个固定级别。但超过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 '(' 
请参见上的演示

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


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

好的,谢谢。我喜欢直截了当的回答。可能需要重新考虑我当前的代码。谢谢你的快速回复:)完成了。实现了如您所述的内容,但我保留了一个计数器而不是堆栈。每个计数器递增(找到并递减)。如果计数器达到0,则表示我已按问题中所述进行了匹配。谢谢:)我会投票支持你的答案,但我还没有足够的代表:S@CedricMamo您应该能够通过单击向上/向下投票下方的复选标记将答案标记为已接受。谢谢。@CedricMamo你能把你实现的代码作为答案发布吗?我看到它指的是混合公司的BF。。。但祝你好运。男朋友看起来像个杂务,没那么糟。我让表达式生成器工作得很好(如果您只使用常量:D),还有表达式、随机数生成器和将字符串转换为紧凑bf代码的工具。当尝试添加功能以便能够从表达式中调用函数时,或从表达式中访问数组中的值时,会出现此问题。为什么要使用正则表达式来查找匹配的括号,而不是使用其他方法?只是为了看看是否可以这样做。它完全可以在某些风格的正则表达式中使用,例如.net。这是我第一次尝试这样做,我需要做更多的研究:)谢谢你的例子,但我会采纳你的建议并修改解析器:)