Javascript 求解正则表达式递归字符串 问题

Javascript 求解正则表达式递归字符串 问题,javascript,regex,recursion,Javascript,Regex,Recursion,我可以配这根线 (xx) 使用这个正则表达式 \([^()]*\) 但它不匹配 (x(xx)x) (x(x(x(xx)x)x)x) 所以,这个正则表达式 \([^()]*\([^()]*\)[^()]*\) [^()]*\([^()]*\([^()]*\)[^()]*\)[^()]* 然而,这将无法匹配 (x(x(xx)x)x) 但是,这个新的正则表达式会 \([^()]*\([^()]*\)[^()]*\) [^()]*\([^()]*\([^()]*\)[^()]*\)[^(

我可以配这根线

(xx)
使用这个正则表达式

\([^()]*\)
但它不匹配

(x(xx)x)
(x(x(x(xx)x)x)x)
所以,这个正则表达式

\([^()]*\([^()]*\)[^()]*\)
[^()]*\([^()]*\([^()]*\)[^()]*\)[^()]*
然而,这将无法匹配

(x(x(xx)x)x)
但是,这个新的正则表达式会

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

(x(xx)x)
(x(x(x(xx)x)x)x)
但是,您可以像我们在上一个正则表达式中所做的那样,将最中间的
[^()]*
复制替换为
[^()]*\([^()]*\)[^()]*
,它将捕获更多的
(xx)
组。您向正则表达式中添加的越多,它就能够处理的越多,但它总是受限于您添加的数量

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

错误假设的解决方案 我知道你可能会想用

\(.*\)
但这将符合所有的要求

(xx)xx)
当它只应与子字符串
(xx)
匹配时

甚至这个

\([^)]*\)
将不匹配具有嵌套对的括号对,如

(xx(xx)xx)
因此,它最多只能匹配
(xx(xx)

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

编辑
该解决方案必须在正则表达式的JavaScript实现中工作

如果只想在圆括号平衡的情况下进行匹配,则不能通过
regex
本身进行匹配

更好的办法是

1> 使用
\(.*)

2> 计算
的数量,并检查它们是否相等。如果相等,则您拥有匹配项


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

从形式上讲,这是不可能使用正则表达式的!正则表达式定义,并且正则语言不能使用平衡括号

然而,事实证明,这是人们一直需要做的事情,因此许多正则表达式引擎已经扩展到包含更多形式的正则表达式。因此,您可以在javascript中使用正则表达式实现平衡括号。本文可能会帮助您入门:。它适用于.net,但同样适用于标准javascript正则表达式引擎


但就个人而言,我认为最好用自己的函数来解决这样一个复杂的问题,而不是利用正则表达式引擎的扩展功能。

所以你希望括号两边都保持平衡。.正确。请注意编辑。有些问题不是针对正则表达式的。使用一个简单的状态机遍历山姆:不,JS正则表达式不能执行这个任务。只需用堆栈解析字符串。使用基于JS的状态机递归分析字符串的例子有哪些链接?我很难找到任何东西。YUP,我会考虑这样的事情。要小心!
!例如,考虑:
)(
())(()
“它适用于.net,但同样适用于标准javascript正则表达式引擎。”不,javascript的正则表达式不支持本文中使用的功能。