【发布时间】:2011-07-05 21:17:12
【问题描述】:
我需要从脚本文件中提取整个 javascript 函数。我知道函数的名称,但我不知道函数的内容可能是什么。这个函数可以嵌入到任意数量的闭包中。
我需要有两个输出值:
- 我在输入脚本中找到的命名函数的整个主体。
- 删除了找到的命名函数的完整输入脚本。
所以,假设我在这个输入脚本中寻找findMe 函数:
function() {
function something(x,y) {
if (x == true) {
console.log ("Something says X is true");
// The regex should not find this:
console.log ("function findMe(z) { var a; }");
}
}
function findMe(z) {
if (z == true) {
console.log ("Something says Z is true");
}
}
findMe(true);
something(false,"hello");
}();
由此,我需要以下两个结果值:
-
提取的
findMe脚本function findMe(z) { if (z == true) { console.log ("Something says Z is true"); } } -
删除了
findMe函数的输入脚本function() { function something(x,y) { if (x == true) { console.log ("Something says X is true"); // The regex should not find this: console.log ("function findMe(z) { var a; }"); } } findMe(true); something(false,"hello"); }();
我正在处理的问题:
要查找的脚本正文中可以包含任何有效的 JavaScript 代码。查找此脚本的代码或正则表达式必须能够忽略字符串、多个嵌套块级别等中的值。
如果要查找的函数定义在字符串中指定,则应忽略。
关于如何完成这样的事情有什么建议吗?
更新:
看起来正则表达式不是执行此操作的正确方法。我愿意接受指向可以帮助我完成此任务的解析器的指针。我正在查看Jison,但我很想知道其他任何事情。
【问题讨论】:
-
您需要使用 javascript 来完成,或者您可以使用其他语言(例如 python)?
-
我在服务器上解析 javascript 文件,但我是在 node.js 中做的。所以最好是 javascript 来做这件事。我现在正在将 Jison 视为一种可能的解决方案:zaach.github.com/jison
-
我刚刚将问题更新为不是正则表达式特定的。基本上,我正在寻找问题的解决方案,无论解决方案是否涉及正则表达式都无关紧要。
-
也许您应该尝试使用正则表达式查找函数名称,然后使用堆栈选择函数体:您从找到函数名称的位置解析文件,推入“{”(或其他任何东西)当你找到一个时在堆栈中,当你找到一个“}”时从堆栈中弹出一个符号。当堆栈变空时,您已经到达函数体的末尾,并且完成了。它肯定不是高效的,也不是非常优雅,但它可能是一个解决方案。
-
它会在任何带有未处理的左括号或右括号的字符串声明上中断。或评论。或者任何让你不关闭括号并保持有效的东西。我不认为有简单的解决方案,只需要扣紧并编写一个(简单的)解析器。
标签: javascript regex parsing