Javascript 正则表达式提取函数体

Javascript 正则表达式提取函数体,javascript,regex,Javascript,Regex,它不起作用。为什么它坏了 这意味着从源代码中提取函数语句的主体 编辑: " function whatever2() { } " 我太傻了。试图用regexp解析javascript是愚蠢的。您不能使用正则表达式来解析javascript语言语法,因为该语言的语法太复杂,regex无法完成 var bodyRegExp = /\{(.+?)\}+$/; console.log("module.exports = function () { /* any content

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

这意味着从源代码中提取函数语句的主体

编辑:

" 
    function whatever2() { 
    } 
"

我太傻了。试图用regexp解析javascript是愚蠢的。

您不能使用正则表达式来解析javascript语言语法,因为该语言的语法太复杂,regex无法完成

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

console.log("module.exports = function () { /* any content */ }".match(bodyRegExp))
你必须使用exec吗

这将返回
[“{/*任何内容*/}”,“/*任何内容*/”]

您的
函数(/*这里是错误的*/)


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

不要逃避你的反斜杠。一定要摆脱你的大括号。不需要使用字符集方括号表达式。改用这个:

var bodyRegExp = /function\s+\(.*\)\s+\{(.+)\}/;
尽管如此,这不是一个非常健壮的表达式-它不适用于多行函数,并且当您的函数有多组paren或花括号时,会产生意外的结果-这似乎极有可能。但它至少应该解决你面临的问题

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

var fnBody = fn.substring(fn.indexOf("{") + 1, fn.lastIndexOf("}"));
如果您试图从包含多个函数的字符串中提取单个函数,则需要编写一个完整的解析算法。或者,如果这样做是安全的,您可以执行JavaScript并通过转到
var fn=module.exports.toString()
获取函数定义字符串,然后将上述代码应用于该字符串。

您需要的正则表达式

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

可以调用func.toString(),然后对其使用此正则表达式

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

myFn.body()
仅此调用,,之后,您可以使用属性
\u body
访问body:

myFn._body

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

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

" 
    function whatever2() { 
    } 
"

非常适合多条线路;然而,就我个人而言,我最喜欢@gilly3的答案,在这个简单的例子中,使用
indexOf
lastIndexOf
而不是正则表达式(正则表达式可能有些过分)。)

Pfft。我有一个VisualStudio宏,它使用正则表达式解析JavaScript文件,并在所有代码块周围添加可折叠区域。我有一卷胶带可以很好地解决我的汽车问题。我可能同意“你不应该使用正则表达式”,但不同意“你不能使用正则表达式”。请为他提供一种替代的、非正则表达式的方式,以进入功能体。(或者让我在VisualStudio中自动创建JavaScript文件中的可折叠区域)我不同意。JavaScript使用LALR语法。自动机理论告诉我们,LALR语法不能用正则表达式解析。这并不意味着LALR语法的子集不能用正则表达式解析,真的。解析JavaScript函数并不是其中的一个子集。事实上,在我看来,这表明了黑客技术和工程技术之间的区别。是的,一个人可以拼凑(拼凑)一些在有限的情况下有效的东西。但是这绝不是一个精心设计的解决方案。
.exec
的高级版本。match
bodyRegExp
对于OP的答案是可以的,但是如果有多行代码,就没有什么好处。你不是在做javascript解析器,而是在尝试反编译函数体。。。非常不同的事情?这就像说“因为你不能用正则表达式生成HTML解析器,那么你就不能用正则表达式获得一个具有已知结构的元素的href属性”。我记得一些流行的库在它们的继承模块中这样做,但我记不起它的名字了。。我将查找它。@Esailija我正在尝试解析语句
module.exports=functionReferenceOrFunctionLiteral位于文件中的某个位置。这不能用regexp完成。好吧,我误解了。如果你需要代码,我会把它放在我的剪贴板上:P(它来自prototype.js),这是一种很好的黑客方式
var fn = function whatever1() { 
    function whatever2() { 
    } 
};
var body = (''+fn).match(/{([^]*)}[^}]*/)[1];
" 
    function whatever2() { 
    } 
"