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

标签 javascript regex recursion

问题

我可以匹配这个字符串

(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/

相关文章:

javascript - 在 Angularjs 中准备金字塔图

Django 中的 Javascript 模块管理(已关闭)

java - 在 Android 中使用正则表达式将 "- "替换为空格

algorithm - 从给定长度的数组中排列整数

c - C 中 JavaScript 非递归解析器的设计(高度内存受限)

php - PHP 与 JavaScript 的局限性有哪些示例?

javascript - Typescript - 从数组项的通用类型创建组合类型

python - 使用 Python 从电子邮件正文中提取 URL?

javascript - 如何使用正则表达式(正则表达式)验证 12 小时时间

c# - 我的程序无故从一行跳到另一行 (C#)