对于 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/