【问题标题】:match opening parenthesis to the corresponding closing parenthesis将左括号匹配到相应的右括号
【发布时间】:2012-02-25 10:42:24
【问题描述】:

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

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

有什么方法可以使用正则表达式分别匹配xx(yyzz(iijj))qq((kkll)(gghh))

【问题讨论】:

  • 我看到它在混合公司中提到了 BF……但祝你好运。 BF 看起来像是一件苦差事。
  • 还不错。我让表达式生成器工作得很好(如果你只使用常量 :D),还有表达式、随机数生成器和将字符串转换为紧凑 bf 代码的工具。当尝试添加功能以能够从表达式中调用函数或从表达式中访问数组中的值时,会出现此问题
  • 为什么要使用正则表达式来查找匹配的括号而不是使用其他方法?
  • 只是看看能不能做到。它完全可以在某些正则表达式中使用,例如 .net 的

标签: java regex


【解决方案1】:

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

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

【讨论】:

  • 好的,谢谢。我喜欢直截了当的回答。那么可能需要重新考虑我当前的代码。感谢您的快速回复:)
  • 完成了。实现了你所描述的东西,除了我保留了一个计数器而不是一个堆栈。为每个增加计数器(找到并为每个减少它)。如果计数器达到 0,则意味着我已经达到了我在问题中描述的匹配。谢谢:)我会投票给你的答案,但我还没有足够的代表:S
  • @CedricMamo 您应该能够通过单击赞成/反对票下方的复选标记将答案标记为已接受。谢谢。
  • @CedricMamo 你能发布你实现的代码作为答案吗?
【解决方案2】:

可以使用正则表达式将嵌套括号匹配到固定级别。但是超过 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 不是其中之一。

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

【讨论】:

  • 这是我第一次尝试这样的事情,我需要做更多的研究:)
  • 感谢您的示例,但我会采纳您的后一个建议并修改解析器 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-26
  • 2019-02-03
  • 2017-06-04
  • 1970-01-01
  • 1970-01-01
  • 2014-06-17
相关资源
最近更新 更多