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

标签 javascript regex

<分区>

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);

上面的工作原理:

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

  2. 如果我们成功了,我们将使用 /\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 解析器。 :-)

关于javascript - 从函数定义中获取参数列表的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13952870/

相关文章:

javascript - 如何将正文的滚动条用于文本区域

javascript - IDEA 警告在 JavaScript 正则表达式中使用花括号。可以吗?

python - 正则表达式将 string1 与 string2 的最长可能子字符串匹配

python - 正则表达式:匹配 'name1: A=a name2:B=b name3:C=c d' 的表达式

javascript - pixabay api 不提供任何结果

javascript - Uncaught ReferenceError : saveData is not defined in Google Maps

javascript - 访问从Web服务返回的json数据

javascript - 如何在按下手机后退按钮时关闭 ionic 弹出窗口

javascript - 如何获得 Javascript 正则表达式匹配的字符串的实际值?

java - java字符串连接空值并检索空值