正则表达式匹配javascript函数的定义并确保它返回一些东西?

时间:2011-09-13 00:00:23

标签: javascript regex function

我需要确保一些提交的代码定义了一个名为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个正则表达式并尝试匹配其中任何一个。

2 个答案:

答案 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没有常规的词法语法。