在匹配整个function时捕获函数的名字

这个正则expression式

/function\s*\(\s*\S*\s*\)\s*\{/ 

应该匹配一个单一的参数函数,像

 function foo ( xyz ) { 

(注意“\ S”将匹配任何非空白字符,并且我们可以假定原始代码在使用可接受的字符时是正确的,所以没关系)

我的问题是,我怎么能像这样匹配一行文字

“baz function foo(xyz){bar”

并捕获这两个:

 "function foo ( xyz ) {" 

 "foo" 

换句话说,我想以某种方式匹配函数签名的开始,以及捕获函数的名称。

我不知道如何做到这一点。

“简单”的方法是做类似的事情:

 var match = str.match(regex); // "function foo ( xyz ) {" var start = 7; // "function" has two 'n's unfortunately var end= match[0].indexOf('('); var result = String(match[0]).substring(start,end).trim(); 

但是我正在寻找一个不太冒险的方式。

您可以使用这样的捕获组来捕获函数签名和函数名称。

正则expression式: function\s+([^(]+)\s*\(\s*[^)]+\s*\)\s*{

说明:

  • function\s+匹配标记函数开始的关键字函数。

  • ([^(]+)匹配并捕获第一组中的函数名称,可以使用\1$1反引用。

  • \s*\(\s*[^)]+\s*\)\s*{rest直到开启大括号{

Regex101演示

尝试这个

 (function\s+([^\(\s]+).*?\)\s*\{) 

正则expression式演示

 var myval = "baz function foo ( xyz ) { bar"; var regex = /(function\s+([^\(\s]+).*?\)\s*\{)/mg while (matches = regex.exec(myval)) { document.writeln(matches[1]) //function definition document.writeln(matches[2]) //function name } 

您可以使用以下内容:

 (function\s*(\S+)?\s*\(\s*\S+\s*\)\s*\{) 

请参阅RegEX DEMO

捕获组1将包含function foo ( xyz ) {和捕获组2将包含foo

编辑:更新匿名function