javascript - 有没有办法只将顶级括号与正则表达式匹配?

标签 javascript regex

对于 Javascript,假设我有一个像 (1)(((2)(3))4) 这样的字符串,我可以得到一个正则表达式来匹配 (1)(((2)(3))4),或者我需要做一些更复杂的事情吗?

理想情况下,如果您搜索 ((2)(3))4,正则表达式将返回 ["((2)(3))","4"] 。其实这确实是一个要求。关键是将事物分组为需要首先处理的 block ,就像数学中括号的工作方式一样。

最佳答案

不,没有办法仅将顶级括号与正则表达式匹配

仅查看顶层并不会让问题比递归结构的一般“解析”更容易。 (参见 this relevant popular SO question 有一个很好的答案)。

这是正则表达式无法解析任意级别嵌套的一个简单直观的原因:

为了跟踪嵌套的级别,必须进行计数。如果希望能够跟踪任意级别的嵌套,则在运行程序时需要任意大的数字。

但正则表达式正是 DFA 可以实现的表达式,即确定性有限自动机。它们只有有限个状态。因此,他们无法跟踪任意的大数字。

这个论点也适用于您只对顶级括号感兴趣的特定问题。

要识别顶级括号,您必须跟踪其中任何一个之前的任意嵌套:

((((..arbitrarily deep nesting...))))((.....)).......()......
^toplevel                           ^^       ^       ^^

所以,是的,您需要比正则表达式更强大的东西。


虽然如果您非常务实,那么对于您的具体应用程序来说,可以说您不会遇到任何深度超过 1000 的嵌套(因此您可能愿意与正则表达式),这也是一个非常实际的事实,任何识别超过 2 层嵌套的正则表达式基本上都是不可读的。

关于javascript - 有没有办法只将顶级括号与正则表达式匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25319558/

相关文章:

regex - 更换信用卡号码

Javascript以特定格式写入时间

javascript - 使用 Github API 获取版本的所有提交部分

javascript - 我只想在给出条件时调用一些循环。但这是错误的

javascript - 积极的前瞻

javascript - 无法通过Nodejs连接到Docker内部的Tarantool容器

c# - 正则表达式在 C# 上的正则表达式属性中不起作用

正则表达式替换字符串之间的字符

c# - 正则表达式:忽略字段之间的空格

javascript - angularjs ng-pattern 的整数验证