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

时间:2012-12-15 04:57:08

标签: javascript regex recursion

问题

我可以匹配此字符串

(xx)

使用此正则表达式

\([^()]*\)

但它不匹配

(x(xx)x)

所以,这个正则表达式

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

然而,这将无法匹配

(x(x(xx)x)x)

但同样,这个新的正则表达式

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

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

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

但是,您可以随时复制将[^()]*中心替换为[^()]*\([^()]*\)[^()]*,就像我们为上一个正则表达式所做的那样,它会捕获更多(xx)个组。您添加到正则表达式的次数越多,它处理的越多,但它总是会受限于您添加的数量。

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

虚假假设解决方案

我知道你可以考虑使用

\(.*\)

但这将匹配所有

(xx)xx)

它应该只匹配子字符串(xx)

即便如此

\([^)]*\)

不匹配具有嵌套对象

的括号对
(xx(xx)xx)

从此,它只会匹配(xx(xx)

有可能吗?

那么可以编写一个可以匹配括号组的正则表达式吗?或者这是必须由例程处理的事情吗?

修改

解决方案必须适用于正则表达式的JavaScript实现

2 个答案:

答案 0 :(得分:2)

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

更好的方法是

1>使用\(.*\)

匹配字符串

2>计算()的数量并检查它们是否相等......如果它们是匹配的

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

答案 1 :(得分:0)

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

然而,事实证明,这是人们需要一直做的事情,因此许多正则表达式引擎已经扩展到包括更多正式的正则表达式。因此,您可以在javascript中使用正则表达式进行平衡括号。本文可能有助于您入门:http://weblogs.asp.net/whaggard/archive/2005/02/20/377025.aspx。它适用于.net,但同样适用于标准的javascript正则表达式引擎。

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