如何在两个大括号之间找到代码,尊重嵌套?

时间:2015-02-05 01:32:50

标签: javascript regex algorithm parsing

我试图在两个大括号之间获取代码,但仍然注意嵌套。说我有类似下面的输入:

while (true) {                    [A]
    dothis();
    if (whattype() == "A") {      [B]
        doA();
        if (other() == "dog") {   [C]
            doB();
        }                         [D]
    }                             [E]
    if (other() == "cat") {       [F]
        doZ();
    }                             [G]
}                                 [H]

我想以递归方式循环每个嵌套层:

while
- if
  - if
- if

当前函数接受字符串,使用正则表达式(\{([\s\S]*)\})贪婪地找到第一个和最后一个大括号之间的代码,并再次对其内容执行此操作,直到字符串中没有大括号为止。

问题是正则表达式不适用于彼此相邻的代码块。正则表达式匹配B之间的文本直到G.它应该从B开始并在E处停止,然后是从F到G的另一个块。

编辑:我最终可能会使用正则表达式之外的其他内容。对于如何处理这个有什么建议吗?


对于未来的读者:

我发现有用的是this来自另一个SO问题的答案。

1 个答案:

答案 0 :(得分:3)

使用整个块的正则表达式无法解决此类问题。

您所描述的内容确实要求对JavaScript语言进行完整且正确的标记化。例如,考虑一下您可能在引用的文本中包含括号...除非您真正看到更多的好处,否则我想要自己完成所有这些,而不是在合理的时间内实际成功(就像您正在玩弄了解解析器的工作方式)那么你一定要看看JS解析器中现有的一些JS。例如:http://marijnhaverbeke.nl/blog/acorn.html(请注意,这是Google给我的第一个结果,从未尝试过该库)。