正则表达式从函数定义中获取参数列表

时间:2012-12-19 12:51:49

标签: javascript regex

  

可能重复:
  How to get function parameter names/values dynamically from javascript

我目前正在研究一个javascript(node.js)项目,我试图从函数中获取一个参数名称(非值,我不需要参数)的数组。我目前正在使用Function.toString()获取函数字符串,然后运行正则表达式以获取我的参数列表。

我们采取以下简单的例子:

var myFunction = function (paramOne, paramTwo) { ... }

运行我的正则表达式,然后做一些字符串魔法(拆分等)我希望像这样的数组:

paramList = ['paramOne', 'paramTwo']

我有一些有用的东西,但我觉得它可能不是最好的解决方案,因为一些时髦的字符javascript允许你使用变量名称,javascript将让你在多行上定义函数。

以下是我目前的情况:

function.*[\w\s$]*(\((.*[\w\s,$]*)\))

这给了我第1组中的“匹配”,然后是第2组中没有任何parens的参数列表,这很酷。这真的是做我想要的最好的方式吗?我可以使用更好的正则表达式吗?我并不是在寻找“更简单”的东西,而是真正能够捕捉所有可能情况的东西。

任何帮助将不胜感激,并提前多多感谢!

3 个答案:

答案 0 :(得分:20)

最简单的方法是捕获第一组parens中的所有内容,然后使用split(/\s*,\s*/)来获取数组。

E.g:

var str = "function(   one  ,\ntwo,three   ,   four   ) { laksjdfl akjsdflkasjdfl }";
var args = /\(\s*([^)]+?)\s*\)/.exec(str);
if (args[1]) {
  args = args[1].split(/\s*,\s*/);
}
snippet.log("args: " + JSON.stringify(args));
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

以上如何运作:

  1. 我们使用/\( *([^)]+?) *\)/来匹配第一个左括号(\(,因为(在正则表达式中是特殊的),后跟任意数量的可选空格,后跟捕获组捕获除了右括号(但非贪婪)之外的所有内容,后跟任意数量的可选空格,然后是结束)

  2. 如果我们成功,我们使用/\s*,\s*/进行拆分,这意味着我们拆分了零个或多个空格字符(\s*)的序列,后跟逗号后跟零个或多个空格字符(这个空白的东西就是为什么我的示例函数中的args非常奇怪)。

  3. 从示例中可以看出,它处理前导空格(在(之后和第一个参数之前),逗号周围的空格和尾随空格 - 包括换行符。 尝试处理参数列表中的注释,这会使事情明显复杂化。


    附注:请务必在目标浏览器上进行测试,Function#toString返回某种形式的源代码是非标准功能。它受到广泛支持(在桌面浏览器中),但不是标准的。请注意,某些浏览器会包含注释,而其他浏览器则不会如果有人在函数参数中包含注释,它可能会搞砸你对它们的解析。你可能会开始Prototype source code for its Function#argumentNames extension,因为他们已经沿着这条路走了......

答案 1 :(得分:3)

执行以下操作:

var ar = str.match(/\((.*?)\)/);
if (ar) {
  var result = ar[0].split(",");
}

记得吗?之后*做了非贪婪的发现

答案 2 :(得分:2)

我建议你使用正则表达式:

  • [match] /function[^(]*\(([^)]*)\)/将匹配参数列表
  • [split] /\W+/(针对第一个匹配数据的结果)会将匹配拆分为参数列表

因此,代码应如下所示:

var s = "function moo (paramOne, paramTwo) { alert('hello'); }";
var s2 = s.match(/function[^(]*\(([^)]*)\)/)[1];
var paramList = s2.split(/\W+/);