我有一个Node模块文件,其中包含大约100个导出的方法,如下所示:
exports.methodOne = async user_id => {
// other method contents
};
exports.methodTwo = async user_id => {
// other method contents
fooMethod();
};
exports.methodThree = async user_id => {
// other method contents
fooMethod();
};:我想要做的是找出如何获取包含对fooMethod的调用的任何方法的名称,并返回正确的方法名称: methodTwo和methodThree。我写了一个正则表达式
exports\.(\w+).*(\n.*?){1,}fooMethodProblem:使用上面的示例代码,它将有效地匹配methodOne和methodThree,因为它找到了export的第一个实例,然后找到了fooMethod的第一个实例,然后继续进行。Here's a regex101 example。
我怀疑我可以使用的外观或后视镜,但我没有经验,这些部分的regex,因此,任何指导将是非常感谢的!
编辑:原来regex并不适合这种类型的任务。@ctcherry建议使用解析器,并以此作为跳板,我能够了解抽象语法树( as )和重铸工具,该工具允许您在使用各种工具(橡子和其他工具)将代码解析为树形式之后遍历树。
有了这些工具,我成功地构建了一个脚本来解析和遍历我的节点应用程序的文件,并且能够按照预期找到所有包含fooMethod的方法。
发布于 2021-12-10 07:31:44
Regex不是解决这个问题所有部分的最好工具,理想情况下,我们可以依赖更高级别的解析器。
这样做的一种方法是让javascript在加载和执行期间解析自己。如果节点模块不包括任何单独执行的内容(或者至少包含任何与下面的内容相冲突的内容),则可以将其放在模块的底部,然后使用node mod.js运行该模块。
console.log(Object.keys(exports).filter(fn => exports[fn].toString().includes("fooMethod(")));(在下面的评论中,我们发现上面的内容是不可能的。)
另一种选择是使用像https://github.com/acornjs/acorn这样的库(还有其他选项)来编写解析原始目标javascript的其他javascript,然后您可以使用一个树结构来执行匹配,并最终返回您想要的函数名。我不是那个库的专家,所以不幸的是,我没有为您提供示例代码。
发布于 2021-12-10 07:03:39
https://stackoverflow.com/questions/70299881
复制相似问题