正则表达式提取函数体

时间:2011-11-18 19:16:20

标签: javascript regex

I have this regexp

var bodyRegExp = /function[\\s]+[(].+[)][\\s]+{(.+)}/;

bodyRegExp.exec("module.exports = function () { /* any content */ }");

它不起作用。它为什么坏了?

这意味着将函数语句的主体从源代码中拉出来。

修改

我是傻瓜。试图用正则表达式解析javascript是愚蠢的。

7 个答案:

答案 0 :(得分:5)

不要逃避你的反斜杠。逃避你的花括号。您的字符集方括号表达式是不必要的。请改用:

var bodyRegExp = /function\s+\(.*\)\s+\{(.+)\}/;

尽管如此,这不是一个非常强大的表达式 - 它不适用于多行函数,并且当你的函数有多组parens或花括号时会产生意想不到的结果 - 这似乎极有可能。但它至少应该解决你遇到的问题。

编辑:如果您总是在处理包含没有前面或后面语句的函数的字符串,那么解决方案非常简单。只需在第一个开口花括号之后和最后一个结束花括号之前获取所有内容。

var fnBody = fn.substring(fn.indexOf("{") + 1, fn.lastIndexOf("}"));

如果您尝试从包含多个函数的字符串中提取单个函数,则需要编写完整的解析算法来执行此操作。或者,如果可以安全地执行此操作,则可以执行JavaScript并通过转到var fn = module.exports.toString()获取函数定义字符串,然后将上述代码应用于该字符串。

答案 1 :(得分:2)

Function.prototype.body=function(){

  this._body=this.toString().substring(this.toString().indexOf("{") + 1, this.toString().lastIndexOf("}"));  
  return this._body;
};

然后:

myFn.body()

就是这个电话,之后您可以使用属性_body

访问正文
myFn._body

答案 2 :(得分:1)

/function[\\s]+[(].+[)][\\s]+{(.+)}/

您的function (/* right here is wrong */)

使用正在使用。+ 一个或更多。所以你需要零或更多,/function +\(.*\) +{(.+)}/

答案 3 :(得分:1)

你需要的正则表达式。

这个将分别提取函数代码的参数和正文。返回一个包含6个项目的数组,数组中的第3个和第5个项目将是参数和函数代码体。可用于从对象中提取方法。

你可以调用func.toString()然后在它上面使用这个正则表达式。

    var matcharray = funcstring.match(/(function\s?)([^\.])([\w|,|\s|-|_|\$]*)(.+?\{)([^\.][\s|\S]*(?=\}))/);

答案 4 :(得分:0)

var bodyRegExp = /\{(.+?)\}+$/;

console.log("module.exports = function () { /* any content */ }".match(bodyRegExp))

你必须使用exec ??

这会返回["{ /* any content */ }", " /* any content */ "]

答案 5 :(得分:0)

我很惊讶没有人做过明显的正则表达式:

var fn = function whatever1() { 
    function whatever2() { 
    } 
};
var body = (''+fn).match(/{([^]*)}[^}]*/)[1];

<强>输出:

" 
    function whatever2() { 
    } 
"

非常适合多条线;但是,就个人而言,我喜欢@ gilly3的答案最好,使用indexOflastIndexOf而不是正则表达式(正则表达式可能有点矫枉过正)。 ;)

答案 6 :(得分:-6)

你不能使用正则表达式来解析JavaScript语言语法,因为该语言的语法对于正则表达式来说太复杂了。