在匹配整个函数时捕获函数名称

时间:2016-04-06 07:31:39

标签: javascript regex node.js

这个正则表达式

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

应匹配单个参数函数,如

function foo ( xyz ) {

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

我的问题是,如何匹配一行文字

  

" baz function foo(xyz){bar"

并抓住这两个:

"function foo ( xyz ) {"

"foo"

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

我不知道该怎么做。

" easy"方法是做类似的事情:

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

但我正在寻找一种不那么黑客的方式。

3 个答案:

答案 0 :(得分:1)

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

正则表达式: function\s+

<强>解释

  • function匹配标记功能开头的关键字([^(]+)

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

  • {匹配休息,直到满足开口大括号{{1}}。

<强> Regex101 Demo

答案 1 :(得分:1)

您可以使用以下内容:

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

请参阅RegEX DEMO

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

编辑:更新了匿名函数

答案 2 :(得分:1)

试试这个

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

<强> Regex Demo

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
}

匿名函数

UPDATE

检查这个

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

<强> Regex Demo

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