【发布时间】:2012-12-15 13:20:57
【问题描述】:
问题
我可以匹配这个字符串
(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 实现中起作用
【问题讨论】:
-
所以你希望括号两边平衡..right
-
正确。还要注意编辑。
-
有些问题不是针对正则表达式的。使用一个简单的状态机,一次遍历字符串一个字符。
-
@Sam:不,JS 正则表达式不能完成这个任务。只需使用堆栈正常解析字符串即可。
-
任何链接到使用基于 JS 的状态机递归解析字符串的示例?我正在努力寻找任何东西。
标签: javascript regex recursion