首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找包含字符串的方法的名称的Regex

查找包含字符串的方法的名称的Regex
EN

Stack Overflow用户
提问于 2021-12-10 04:50:32
回答 2查看 128关注 0票数 -2

我有一个Node模块文件,其中包含大约100个导出的方法,如下所示:

代码语言:javascript
复制
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。我写了一个正则表达式

代码语言:javascript
复制
exports\.(\w+).*(\n.*?){1,}fooMethod

Problem:使用上面的示例代码,它将有效地匹配methodOne和methodThree,因为它找到了export的第一个实例,然后找到了fooMethod的第一个实例,然后继续进行。Here's a regex101 example

我怀疑我可以使用的外观或后视镜,但我没有经验,这些部分的regex,因此,任何指导将是非常感谢的!

编辑:原来regex并不适合这种类型的任务。@ctcherry建议使用解析器,并以此作为跳板,我能够了解抽象语法树( as )和重铸工具,该工具允许您在使用各种工具(橡子和其他工具)将代码解析为树形式之后遍历树。

有了这些工具,我成功地构建了一个脚本来解析和遍历我的节点应用程序的文件,并且能够按照预期找到所有包含fooMethod的方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-10 07:31:44

Regex不是解决这个问题所有部分的最好工具,理想情况下,我们可以依赖更高级别的解析器。

这样做的一种方法是让javascript在加载和执行期间解析自己。如果节点模块不包括任何单独执行的内容(或者至少包含任何与下面的内容相冲突的内容),则可以将其放在模块的底部,然后使用node mod.js运行该模块。

代码语言:javascript
复制
console.log(Object.keys(exports).filter(fn => exports[fn].toString().includes("fooMethod(")));

(在下面的评论中,我们发现上面的内容是不可能的。)

另一种选择是使用像https://github.com/acornjs/acorn这样的库(还有其他选项)来编写解析原始目标javascript的其他javascript,然后您可以使用一个树结构来执行匹配,并最终返回您想要的函数名。我不是那个库的专家,所以不幸的是,我没有为您提供示例代码。

票数 1
EN

Stack Overflow用户

发布于 2021-12-10 07:03:39

此正则表达式匹配(仅)包含对fooMethod();的调用的方法名。

代码语言:javascript
复制
(?<=exports\.)\w+(?=[^{]+\{[^}]+fooMethod\(\)[^}]+};)

现场演示

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70299881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档