如何提取函数内部使用的多个方法名

how to extract mulitple method names which are used inside of a function

本文关键字:方法 内部 何提取 提取 函数      更新时间:2023-09-26

我从ui ace中得到一个字符串形式的Javascript函数,如下所示,

aceCode = "function funtionName(){ methodAdd(4,8); methodSub(8,4)}";

我只想从aceCode中提取方法名称作为methodAdd,methodSub,他们有这样做的选择吗?

仅使用正则表达式自行解析JavaScript是非常非常脆弱的。使用适当的JavaScript解析器,如Esprima,然后扫描抽象语法树。

function findFunctionCalls(ast) {
  if (Array.isArray(ast)) {
    return Array.prototype.concat.apply([], ast.map(findFunctionCalls));
  } else if (ast.type == "CallExpression") {
    return [ast.callee.name];
  } else if (ast.type == "ExpressionStatement") {
    return findFunctionCalls(ast.expression);
  } else if (ast.body) {
    return findFunctionCalls(ast.body);
  } else {
    console.error("Oops, I didn't cover that case (" + ast.type + ")");
    return [];
  }
}
var aceCode = "function funtionName(){ methodAdd(4,8); methodSub(8,4)}";
var ast = esprima.parse(aceCode);
console.log(findFunctionCalls(ast));
<script src="https://cdn.rawgit.com/jquery/esprima/2.7.1/esprima.js"></script>
<!-- results pane console output; see http://meta.stackexchange.com/a/242491 -->
<script src="http://gh-canon.github.io/stack-snippet-console/console.min.js"></script>

这是一个极小的片段,用来展示发布的极小示例的想法;它可能没有涵盖所有的节点类型,但对缺失的节点类型进行扩展是很琐碎的。

使用正则表达式的方法是:

'b('w+)'(

也就是说,寻找一个单词边界('b),捕获一个组中的每个单词字符('w),后面跟着一个括号。看看这里的工作演示。

要只获取花括号内的methodAddmethodSub和一般函数,可以将正则表达式更改为:

('w*)'([^)]*')(?!{)

请在此处查看此解决方案的另一个工作演示。提示:感谢Harpreet Singh指出第一个没有正常工作。