问题
我可以匹配这个字符串
(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 实现