Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在匹配整个函数时捕获函数名_Javascript_Regex_Node.js - Fatal编程技术网

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

Javascript 在匹配整个函数时捕获函数名,javascript,regex,node.js,Javascript,Regex,Node.js,这个正则表达式 /function\s*\(\s*\S*\s*\)\s*\{/ 应该匹配一个单参数函数,比如 function foo ( xyz ) { (请注意,“\S”将匹配任何非空白字符,我们可以假设原始代码使用可接受的字符是正确的,因此可以) 我的问题是,如何匹配这样一行文本 “baz函数foo(xyz){bar” 并抓住这两个方面: "function foo ( xyz ) {" 及 换句话说,我希望以某种方式匹配函数签名的开头,并捕获函数的名称 我不知道该怎么做 “简单”的

这个正则表达式

/function\s*\(\s*\S*\s*\)\s*\{/
应该匹配一个单参数函数,比如

function foo ( xyz ) {
(请注意,“\S”将匹配任何非空白字符,我们可以假设原始代码使用可接受的字符是正确的,因此可以)

我的问题是,如何匹配这样一行文本

“baz函数foo(xyz){bar”

并抓住这两个方面:

"function foo ( xyz ) {"

换句话说,我希望以某种方式匹配函数签名的开头,并捕获函数的名称

我不知道该怎么做

“简单”的方法是这样做:

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

但是我正在寻找一种可能不太老套的方法。

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

Regex:
函数\s+([^(]+)\s*\(\s*[^)]+\s*\)\s*{

说明:

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

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

  • \s*\(\s*[^)]+\s*\)\s*{
    匹配rest,直到满足打开的花括号
    {


您可以使用以下功能:

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

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

编辑:已更新匿名函数

试试这个

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

var myval=“baz函数foo(xyz){bar”;
var regex=/(函数\s+([^\(\s]+).*?\)\s*\{)/mg
while(matches=regex.exec(myval)){
document.writeln(匹配[1])//函数定义
document.writeln(匹配[2])//函数名

}
谢谢,我试过了,我不认为它与这行代码“在(函数(d){”之后”匹配,知道为什么吗?@AlexMills:因为它是一个匿名函数,没有名字。废话,我应该规定这个,如果没有名字,你能让它工作吗?我想把它从(\s+)改为(\s*)?嗯,这个(\s+)比(\s*)有优势吗?谢谢,如果它是匿名函数,它会工作吗?
(function\s+([^\(\s]+).*?\)\s*\{)