求解正则表达式递归字符串



问题

我可以匹配这个字符串

(xx)

使用此regex

([^()]*)

但它与不匹配

(x(xx)x)

因此,这个正则表达式将

([^()]*([^()]*)[^()]*)

然而,这将与不匹配

(x(x(xx)x)x)

但是,这个新的正则表达式将

[^()]*([^()]*([^()]*)[^()]*)[^()]*

这是您可以注意到复制的地方,第一个(之后和最后一个)之前的第二个正则表达式的整个正则表达式模式被复制并替换最中间的[^()]*。当然,最后一个正则表达式与不匹配

(x(x(x(xx)x)x)x)

但是,您可以像上一个正则表达式那样,将最中心的[^()]*复制为[^()]*([^()]*)[^()]*,这样它将捕获更多的(xx)组。添加到regex的次数越多,它就可以处理得越多,但它总是受添加量的限制。

那么,如何绕过这个限制,捕获一组括号(或者任何两个字符),其中可以包含额外的组呢?

错误假设的解决方案

我知道你可能会考虑只使用

(.*)

但这将匹配所有

(xx)xx)

当它应该只匹配子串CCD_ 7时。

即使是这个

([^)]*)

将不匹配具有像一样嵌套的括号对

(xx(xx)xx)

由此,它将只匹配(xx(xx)

有可能吗

那么,有可能编写一个正则表达式来匹配括号组吗?或者这是必须按照惯例处理的事情?

编辑

该解决方案必须在正则表达式的JavaScript实现中工作

如果只想在圆括号平衡的情况下进行匹配,则不能通过regex本身进行匹配。。

更好的方法是

1> 使用(.*)匹配字符串

2> 计算()的数量,并检查它们是否相等。。如果他们是,那么你有匹配的

3> 如果它们不相等,则使用([^()]*)来匹配所需的字符串

从形式上讲,使用正则表达式是不可能的!正则表达式定义正则语言,而正则语言不能有平衡括号。

然而,事实证明,这正是人们需要一直做的事情,因此许多Regex引擎已经扩展到包括正式正则表达式之外的内容。因此,您可以在javascript中对正则表达式使用平衡括号。这篇文章可能会帮助您开始:http://weblogs.asp.net/whaggard/archive/2005/02/20/377025.aspx。它适用于.net,但同样适用于标准的javascript正则表达式引擎。

不过,就我个人而言,我认为最好用自己的函数来解决这样一个复杂的问题,而不是利用Regex引擎的扩展功能。

最新更新