首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在javascript中查找所有带有两个以上参数的函数签名

在javascript中查找所有带有两个以上参数的函数签名
EN

Stack Overflow用户
提问于 2015-05-12 20:06:15
回答 3查看 2.1K关注 0票数 3

我需要找到接受超过X参数的所有函数签名(比如2)。我尝试了一些类似function\s*\((\w*,){3,10}的东西(它可以用3-10个args捕获所有签名,但是它没有工作。)它的变化正在产生意想不到的结果。我想我只是不太擅长regex,但是任何帮助都是值得感激的。

更新:我应该指出,我正在编写一种代码检查工具。在这许多事情中,我想找出接受两个以上参数的函数(因为我提倡使用很少参数的函数,在构造函数的情况下使用一个参数)。所以我不能打电话给arguments.length等。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-12 20:16:48

首先,JavaScript是而不是--一种常规语言,因此,人们不能使用正则表达式来完全掌握语言,因此您可能会接受假阳性或假否定。

一个可能很接近的正则表达式是:

代码语言:javascript
运行
复制
function(?:\s+\w+)*\s*\(([^),]*)(\s*,\s*[^),]*){2,}\)

regex的工作方式如下:

  • function搜索function关键字。
  • 接下来是一个可选的组\s+\w+,这个组用于标识函数的名称:可以定义一个没有名称的http://en.wikibooks.org/wiki/JavaScript/Anonymous_Functions,所以这个组必须是可选的。
  • 接下来,\s*\(有一个任意数目的空格和一个括号来打开参数列表;
  • 现在,在括号之间,我们开始寻找参数。为了涵盖(大多数)情况,我们将参数定义为[^,)]* (不包含逗号或结束括号的字符序列)。
  • 现在,对于下一个参数,我们需要跳过逗号,这是由\s*,\s*模式强制执行的(\s*实际上是不必要的)。接下来,一个参数名称的组,当然,我们需要跳过至少两个逗号。
  • 最后,一个(可选的)关闭括号。
票数 2
EN

Stack Overflow用户

发布于 2015-05-12 20:41:38

只要想想“容易”:

  • 方法通常具有(...)\(\)
  • 一个包含3个参数的方法在括号内有2 ,\(,{2,2}\)
  • 每个,都需要在前面加上字符串:\((?:\w+,\w+){2,2}\)
  • 不发生双重匹配,所以不起作用-让前面的字符串是强制性的,下面是可选的,但是最后它需要用一个字符串停止:\((?:\w+,\w*){2,2}\w+\)
  • 通常,方法声明以function namefunction\s+\w+\s*\((?:\w*,\w*){2,2}\)开头
  • 最后,在参数周围可以有白色空间:function\s+\w+\s*\((?:\s*\w+\s*,\s*\w*\s*){2,2}\w+\s*\)

这就对了。这应该涵盖所有“公共”方法声明,但无名lambda-表达式除外:

代码语言:javascript
运行
复制
function\s+\w+\s*\((?:\s*\w+\s*,\s*\w*\s*){2,2}\w+\s*\)

Debuggex Demo

匹配两个到两个逗号将找到带有3个参数的签名。Matchint 2到5个逗号将找到签名,包含3个最多6个参数。

票数 4
EN

Stack Overflow用户

发布于 2015-05-12 20:20:13

您可能希望使用function\s*\w+\s*\(\s*(\w+,?){3,10}来匹配非匿名(命名)函数,并删除\w+\s*以获取匿名函数的function\s*\(\s*(\w+,?){3,10}

可以将这些组合起来获得function\s*(?:\w+\s*)?\(\s*(\w+,?){3,10} ( ?:是非捕获组)。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30200446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档