解决正则表达式递归字符串

Sam*_*Sam 6 javascript regex recursion

问题

我可以匹配这个字符串

(xx)
Run Code Online (Sandbox Code Playgroud)

使用这个正则表达式

\([^()]*\)
Run Code Online (Sandbox Code Playgroud)

但它不匹配

(x(xx)x)
Run Code Online (Sandbox Code Playgroud)

所以,这个正则表达式会

\([^()]*\([^()]*\)[^()]*\)
Run Code Online (Sandbox Code Playgroud)

但是,这将无法匹配

(x(x(xx)x)x)
Run Code Online (Sandbox Code Playgroud)

但同样,这个新的正则表达式会

[^()]*\([^()]*\([^()]*\)[^()]*\)[^()]*
Run Code Online (Sandbox Code Playgroud)

在这里您可以注意到复制,第一个正则表达式的第一个正则表达式模式\(在第一个\)复制之后和最后一个复制之前并替换最中心[^()]*.当然,这最后一个正则表达式是不匹配的

(x(x(x(xx)x)x)x)
Run Code Online (Sandbox Code Playgroud)

但是,您可以随时复制替换中心[^()]*,[^()]*\([^()]*\)[^()]*就像我们为最后一个正则表达式所做的那样,并且它将捕获更多(xx)组.您添加到正则表达式的次数越多,它处理的越多,但它总是会受限于您添加的数量.

那么,你如何解决这个限制并捕获一组括号内的括号(或任何两个字符),其中可以包含额外的组?

错误地假设解决方案

我知道你可能会考虑使用

\(.*\)
Run Code Online (Sandbox Code Playgroud)

但这将匹配所有

(xx)xx)
Run Code Online (Sandbox Code Playgroud)

什么时候它应该只匹配子串(xx).

即使这样

\([^)]*\)
Run Code Online (Sandbox Code Playgroud)

不会匹配具有嵌套对的括号对

(xx(xx)xx)
Run Code Online (Sandbox Code Playgroud)

从这一点来说,它只会匹配(xx(xx).

可能吗?

那么可以编写一个可以匹配括号组的正则表达式吗?或者这是必须由例程处理的事情吗?

编辑

该解决方案必须适用于正则表达式的JavaScript实现

Ani*_*dha 2

如果您只想在圆括号平衡时进行匹配,则您无法单独完成它regex

更好的方法是

1>使用匹配字符串\(.*\)

2>计算 的数量()并检查它们是否相等。如果相等,则匹配

3>如果不相等则使用\([^()]*\)匹配所需的字符串