我可以匹配此字符串
(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实现
答案 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引擎的扩展功能。