我需要确保一些提交的代码定义了一个名为mapfn
的函数,并且该函数返回一个结果。我提出了以下正则表达式:
mapfn\s+?\=\s+?function\s+?\(split\)\s+?\{.+?return\(result\).+?\}
匹配类似
mapfn = function (split) {
var i = 5+4;
for (var j = 0; j < 10; j++) {
i += j*Math.random()*10;
}
var result = i;
return(result)
}
哪个是可取的,但是如果我使用这个代码来获取一个示例闭包编译器并获得类似mapfn=function(){for(var b=9,a=0;a<10;a++)b+=a*Math.random()*10;return b};
的东西,则该正则表达式是无用的。此外,用户提交类似
function mapfn (split) {
var i = 5+4;
for (var j = 0; j < 10; j++) {
i += j*Math.random()*10;
}
var result = i;
return(result)
}
然后正则表达式也没用。
对于这个问题,我觉得有一个更优雅的解决方案,而不是为这个工作准备5个或6个正则表达式并尝试匹配其中任何一个。
答案 0 :(得分:8)
完全无法使用正则表达式。
考虑
function x() { if (1 < 0) return 7; }
您所能做的就是在Javascript环境中解析函数,调用它,并查看它返回的内容。
如果你想确保总是返回一个值,你需要解决Halting Problem。
答案 1 :(得分:2)
SLaks是对的,但你不需要调用暂停问题来证明使用正则表达式是不可能的。使用正则表达式,您甚至无法判断JavaScript函数是否包含return
用作关键字,即使您可以匹配大括号来说明定义函数的结束位置。
考虑
function () {
1 /[/**/]; return 1 ///
}
VS
function () {
/[/**/]; return 1 ///
}
第一个包含一个返回,因为它等同于
function () {
1 / [];
return 1;
///
}
但第二个不是因为它等同于
function () {
new RegExp("[\\/\\*\\*\\/]; return 1 ");
//
}
/*
和*/
之间可能有任意多个字符,因此您需要完全消除第一个/
的歧义,以判断它是分词运算符还是正则表达式来判断是否关键字return
出现在函数中。这需要一个完整的解析,而JavaScript没有常规的词法语法。