我正在研究javascript(node.js)中的一个项目,我试图从函数中获取一个参数名称数组(NOT值,我不需要参数).我目前正在使用Function.toString()获取函数字符串,然后运行正则表达式以获取我的参数列表.
我们来看下面的简单示例:
var myFunction = function (paramOne, paramTwo) { ... }
Run Code Online (Sandbox Code Playgroud)
运行我的正则表达式,然后做一些字符串魔术(拆分等),我希望像这样的数组:
paramList = ['paramOne', 'paramTwo']
Run Code Online (Sandbox Code Playgroud)
我有一些有用的东西,但我觉得它可能不是最好的解决方案给定一些时髦的字符javascript允许你使用变量名称和javascript将让你在多行定义功能.
这是我目前拥有的:
function.*[\w\s$]*(\((.*[\w\s,$]*)\))
Run Code Online (Sandbox Code Playgroud)
这给了我第1组中的"匹配",然后是第2组中没有任何parens的参数列表,这很酷.这真的是做我想要的最好的方式吗?我可以使用更好的正则表达式吗?我并不是在寻找"更简单"的东西,而是真正能够捕捉到所有可能情况的东西.
任何帮助将不胜感激,并提前多多感谢!
T.J*_*der 22
最简单的方法是捕获第一组parens中的所有内容,然后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*/);
}
snippet.log("args: " + JSON.stringify(args));Run Code Online (Sandbox Code Playgroud)
<!-- 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>Run Code Online (Sandbox Code Playgroud)
以上是如何工作的:
我们使用/\( *([^)]+?) *\)/匹配第一个左括号(\(因为(在正则表达式中是特殊的),后跟任意数量的可选空格,然后是捕获组捕获除了右括号(但非贪婪)之外的所有内容,后跟任意数量的可选空格,随后结束).
如果我们成功,我们拆分使用/\s*,\s*/,这意味着我们拆分序列,这些序列是零或更多的空格字符(\s*)后跟一个逗号后跟零个或多个空白字符(这个空白的东西就是为什么我的示例函数中的args是如此奇怪) .
正如你可以看到的例子,这个手柄是空白(后(与之前的第一个参数),空格周围逗号和结尾的空白-包括换行.它并没有试图处理参数列表,这将显着复杂的事情中的注释.
附注:请务必在目标浏览器上进行测试,Function#toString返回某种形式的源代码是非标准功能.它受到广泛支持(在桌面浏览器中),但不是标准的.请注意,某些浏览器会包含注释,而其他浏览器则不会 如果有人在函数参数中包含注释,它可能会搞砸你对它们的解析.您可能会为其Function#argumentNames扩展启动Prototype源代码,因为他们已经走了这条道路......