Possible Duplicate:
How to get function parameter names/values dynamically from javascript
我目前正在使用 javascript (node.js) 开发一个项目,该项目让我尝试从函数中获取参数 names 的数组(不是值,我不需要参数)。我目前正在使用 Function.toString() 来获取函数字符串,然后针对它运行正则表达式来获取我的参数列表。
让我们来看下面这个简单的例子:
var myFunction = function (paramOne, paramTwo) { ... }
针对此运行我的正则表达式,然后执行一些字符串魔术(拆分等)我希望返回一个像这样的数组:
paramList = ['paramOne', 'paramTwo']
我有一些有用的东西,但我觉得这可能不是最好的解决方案,因为 javascript 允许您使用一些时髦的字符作为变量名,而 javascript 将允许您在多行上定义函数。
这是我目前拥有的:
function.*[\w\s$]*(\((.*[\w\s,$]*)\))
这给了我第 1 组中的“匹配项”,然后是第 2 组中没有括号的参数列表,这很酷。这真的是做我想做的最好的方法吗?我可以为此使用更好的正则表达式吗?我并不是真的在寻找“更简单”的东西,而只是寻找可以捕捉所有可能情况的东西。
如有任何帮助,我们将不胜感激,在此先致谢!
前言:到目前为止,处理此问题的最佳方法是使用 JavaScript 解析器,而不是尝试使用单个正则表达式。正则表达式可以是解析器的一部分,但没有一个正则表达式可以完成解析器的工作。 JavaScript 的语法(与大多数编程语言的语法一样)过于复杂且对上下文敏感,无法使用一两个简单的正则表达式来处理。有几个用 JavaScript 编写的开源 JavaScript 解析器。我强烈建议使用其中之一,而不是下面的内容。
最简单的方法是捕获第一组括号中的所有内容,然后使用 split(/\s*,\s*/)
获取数组。
例如:
var str = "function( one ,\ntwo,three , four ) { laksjdfl akjsdflkasjdfl }";
var args = /\(\s*([^)]+?)\s*\)/.exec(str);
if (args[1]) {
args = args[1].split(/\s*,\s*/);
}
console.log("args: ", args);
上面的工作原理:
我们使用 /\( *([^)]+?) *\)/
来匹配第一个左括号 (\(
因为 (
在正则表达式中是特殊的),后跟任意数量的可选空格,然后是一个捕获组捕获除了右括号(但非贪婪)之外的所有内容,然后是任意数量的可选空格,然后是结束)
。
如果我们成功了,我们将使用 /\s*,\s*/
进行拆分,这意味着我们拆分包含零个或多个空白字符的序列 (\s*
) 后跟一个逗号,后跟零个或多个空白字符(这个空白就是为什么我的示例函数中的 args 如此奇怪的原因)。
正如您从示例中看到的那样,这会处理前导空格(在 (
之后和第一个参数之前)、逗号周围的空格和尾随空格——包括换行符。它确实 不要尝试处理参数列表中的注释,这会使事情明显复杂化。
注意:上面没有处理 ES2015 的默认参数值,它可以是任意表达式,包括包含 )
的表达式— 通过提前停止搜索来打破上面的正则表达式:
var str = "function( one ,\ntwo = getDefaultForTwo(),three , four ) { laksjdfl akjsdflkasjdfl }";
var args = /\(\s*([^)]+?)\s*\)/.exec(str);
if (args[1]) {
args = args[1].split(/\s*,\s*/);
}
console.log("args: ", args);
这让我们转了一圈:使用 JavaScript 解析器。 :-)