6

问题

我可以匹配这个字符串

(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 实现

4

2 回答 2

2

If you want to match only if the round brackets are balanced you cannot do it by regex itself..

a better way would be to

1>match the string using \(.*\)

2>count the number of (,) and check if they are equal..if they are then you have the match

3>if they are not equal use \([^()]*\) to match the required string

于 2012-12-15T05:02:58.307 回答
0

正式地说,这是不可能使用正则表达式的!正则表达式定义正则语言,正则语言不能有平衡括号。

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

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

于 2012-12-15T05:20:57.147 回答