正则表达式匹配括号中的Javascript函数中的args

时间:2014-01-14 03:47:51

标签: javascript regex parsing

我正在努力构建一个正则表达式来匹配js函数参数。我正在开发一个项目,我需要解析javascript,我需要正则表达式来匹配函数括号之间的所有内容。

function foo (bar) {}  // should match 'bar'

Foo.bar = function  (baz, obj) {} // should match only 'baz, obj'

它应该只匹配'function'或'function foo'之后的东西,基本上所以它与函数体内的paren之间的东西不匹配。我需要它来排除实际的'('和')'字符。我也是'function'或函数名称和开头'之间的空格'('可以是无限的。

这是我到目前为止所得到的,我只得到第二个例子的匹配,并且只有在'function'和'('之间只有一个空格。正则表达式不是我的强项,所以这可能不均匀是可能的,但提前谢谢!

(?<=,|\()([#a-z0-9]+)(?=(,?[#a-z0-9]+)+\)|\))

更新: 这是我试图开始工作的另一种表达方式。它比上面的更接近,但只允许'function'和'('之间只有一个空格。它也不包括上面的情况1.

\b(?<=(function.)\()([^),]+)[^)]*\b

2 个答案:

答案 0 :(得分:4)

尝试:

var s = "Foo.bar = function  (baz, obj) {}"
var s2 = s.match(/function[^(]*\(([^)]*)\)/)[1];
console.log(s2); //would give baz and obj


var s = "function foo (bar) {}";
var s2 = s.match(/function[^(]*\(([^)]*)\)/)[1];
console.log(s2); //returns bar

<强>更新

var pattern = /\(([^)]+)/;
var s = "Foo.bar = function  (baz, obj) {}"
var s2 = s.match(pattern)[1];
console.log(s2);

答案 1 :(得分:1)

来自Angular Sources

TL; DR: var FN_ARG = /^function\s*[^\(]*\(\s*([^\)]*)\)/m, 然后str.match(FN_ARG)[1]

它仅适用于参数(适用于您的问题),但不适用于参数。

var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m;
var FN_ARG_SPLIT = /,/;
var FN_ARG = /^\s*(_?)(\S+?)\1\s*$/;
var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
var $injectorMinErr = minErr('$injector');
function annotate(fn) {
  var $inject,
      fnText,
      argDecl,
      last;

  if (typeof fn == 'function') {
    if (!($inject = fn.$inject)) {
      $inject = [];
      if (fn.length) {
        fnText = fn.toString().replace(STRIP_COMMENTS, '');
        argDecl = fnText.match(FN_ARGS);
        forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg){
            arg.replace(FN_ARG, function(all, underscore, name){
              $inject.push(name);
              });
            });
      }
      fn.$inject = $inject;
    }
  } else if (isArray(fn)) {
    last = fn.length - 1;
    assertArgFn(fn[last], 'fn');
    $inject = fn.slice(0, last);
  } else {
    assertArgFn(fn, 'fn', true);
  }
  return $inject;
}

首先,角度剥离可能的空格和注释。然后,在FN_ARGS中,它匹配关键字function之后的可选函数名称,并提取由逗号连接的参数列表。最后,它用逗号分隔arg列表。

如果您知道评论不会出现,您可以跳过评论部分。如果你想对注意事项进行评论,那么构造的REGEXP将会太长。

最后,不要忘记m标志,以使多线模式中的正则表达式在主题字符串中每行的开头和结尾处与插入符号和美元匹配。