问题
我可以匹配这个字符串
(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 实现中工作
最佳答案
如果你只想在圆括号平衡时匹配,你不能通过 regex
本身来完成..
更好的方法是
1>使用\(.*\)
匹配字符串
2>计算 (
,)
的数量并检查它们是否相等..如果相等则匹配
3>如果它们不相等使用\([^()]*\)
来匹配所需的字符串
关于javascript - 解决正则表达式递归字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13889446/