我试图在两个大括号之间获取代码,但仍然注意嵌套。说我有类似下面的输入:
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问题的答案。
答案 0 :(得分:3)
使用整个块的正则表达式无法解决此类问题。
您所描述的内容确实要求对JavaScript语言进行完整且正确的标记化。例如,考虑一下您可能在引用的文本中包含括号...除非您真正看到更多的好处,否则我想要自己完成所有这些,而不是在合理的时间内实际成功(就像您正在玩弄了解解析器的工作方式)那么你一定要看看JS解析器中现有的一些JS。例如:http://marijnhaverbeke.nl/blog/acorn.html(请注意,这是Google给我的第一个结果,从未尝试过该库)。