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实现
如果您只想在圆括号平衡时进行匹配,则您无法单独完成它regex。
更好的方法是
1>使用匹配字符串\(.*\)
2>计算 的数量(,)并检查它们是否相等。如果相等,则匹配
3>如果不相等则使用\([^()]*\)匹配所需的字符串