Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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 - Fatal编程技术网

Javascript 如何编写正则表达式来查找字符串中的所有函数名?

Javascript 如何编写正则表达式来查找字符串中的所有函数名?,javascript,regex,Javascript,Regex,我想知道为以下字符串编写正则表达式以查找所有函数名 "var sampleFunc = function(){return 'hello';}alert(sampleFunc());function sampleTest(){var sampleTestVar = 'one';};var sampleFunc = function(){return 'hello';}alert(sampleFunc());function sampleTest(){var sampleTestVar = 'on

我想知道为以下字符串编写正则表达式以查找所有函数名

"var sampleFunc = function(){return 'hello';}alert(sampleFunc());function sampleTest(){var sampleTestVar = 'one';};var sampleFunc = function(){return 'hello';}alert(sampleFunc());function sampleTest(){var sampleTestVar = 'one';};"
上面的字符串包含简单的JS程序。我想得到上面字符串的输出,如下所示:

["sampleFunc", "sampleTest", "sampleFunc", "sampleTest"]
帮我写正则表达式解决上述问题

var re=/(\w+)\(\)/g
// var re=/([\w_-]+)\(\)/g 
var rslt = s.match(re)

仍然保持简单。

首先,您必须删除可能包含混淆内容的不需要的注释(参见下面的示例),然后删除所有新行,最后删除块注释。然后可以匹配函数名。有两种类型,一种使用
funcName=function
声明,另一种使用
function funcName
声明。两者都需要不同的regexp

工作代码:

函数getNames(文本){
text=text。替换(/\/\/.*?\r?\n/g,“”//首先,删除行注释
.replace(/\r?\n/g,“”),然后删除新行(将它们替换为空格以不破坏结构)
.replace(//\/\*.*?\*\//g,“”;//然后删除块注释
//第1部分:使用:var*=函数声明的匹配函数
var varFuncs=(text.match(/[$A-Z_uquo][0-9A-Z_quo]*\s*=\s*函数[(]/gi)| |[])//匹配\s*=\s*函数前面的任何有效函数名
.map(函数(tex){//然后仅从匹配项中提取函数名
返回tex.match(/^[$A-Z_][0-9A-Z_$]*/i)[0];
});
//第2部分:使用:函数*声明的匹配函数
var functionFuncs=(text.match(/function\s+[^(+]+/g)| |[])//匹配函数后面和前面的任何内容(
.map(函数(tex){//然后仅从匹配项中提取名称
返回tex.match(/[$A-Z_][0-9A-Z_$]*$/i)[0];
});
返回{
var:varFuncs,
函数:functions
};
}
变量文本=
`var sampleFunc=函数(){
返回“你好”;
}
/*
函数thisNotReallyFunction(){}
*/
警报(sampleFunc());
函数/*不需要的注释*/sampleTest(){
var-sampleTestVar='one';
};
变量抽样函数=
//还可以!
函数(){
返回“你好”;
}
警报(sampleFunc());
功能
//所有的评论
样本测试()
/*甚至
*方块
*/
{
var-sampleTestVar='one';
};
var sampleFuncEDIT=函数(){};
var functionnamedit=“sampleFunc”;
`;
var name=getNames(文本);

console.log(names);
好的,这里是另一种方法。在这种更安全可靠的方法中,我使用了CodeMirror用于解析javascript的库。它是一个非常强大的基于web的代码编辑器,几乎在任何地方都可以使用(甚至在这里)

代码:

首先,代码如下:

HTML:

示例:

函数getFunctionNames(代码字符串){
变量名称=[];
acorn.walk.simple(acorn.parse(codeString){
AssignmentExpression:函数(节点){
if(node.left.type==“Identifier”&&(node.right.type==“FunctionExpression”| | node.right.type==“ArrowFunctionExpression”)){
name.push(node.left.name);
}
},
VariableDeclaration:函数(节点){
node.declarations.forEach(函数(声明){
if(declaration.init&(declaration.init.type==“FunctionExpression”| | declaration.init.type==“ArrowFunctionExpression”)){
name.push(声明.id.name);
}
});
},
函数:函数(节点){
if(node.id){
name.push(node.id.name);
}
}
});
返回姓名;
}
console.log(getFunctionNames(`
var sampleFunc=函数(){
返回“你好”;
}
/*
函数thisNotReallyFunction(){}
*/
警报(sampleFunc());
函数/*不需要的注释*/sampleTest(){
var-sampleTestVar='one';
};
变量抽样函数=
//还可以!
函数(){
返回“你好”;
}
警报(sampleFunc());
功能
//所有的评论
样本测试()
/*甚至
*方块
*/
{
var-sampleTestVar='one';
};
var-sampleFuncEDIT;
sampleFunEDIT=函数(){};
var functionnamedit=“sampleFunc”;
`));


请和。你尝试过什么?你不能用正则表达式来做这件事。你需要将其解析为JS。要添加到Oliver的评论中,你不能这样做,因为JavaScript不是一种常规语言。事实上,我的代码看起来很凌乱。所以我不想让人们对我的代码感到困惑。我真的想问一下我在寻找什么,我确实这样做了。现在我确实从“ibrahim mahir”那里得到了答案(他的答案见下文)。我很高兴!非常感谢您对ctwheels@ctwheelsOk的贡献。我确实从“ibrahim mahir”那里得到了答案(他的答案见下文)。我理解您的观点,即不解析它,我无法得到正确的函数名。“ibrahim mahir”给出的解决方案对我来说已经足够了。非常感谢你的贡献奥利弗。@OliverCharlesworth非常感谢易卜拉欣。你的代码看起来非常清晰易懂。我对正则表达式不熟悉,自己尝试过编写代码,结果得到了近100行代码。你的代码看起来简单多了,运行得非常好。再次感谢你感谢你的帮助。我需要指出的是,你的答案看起来也很简洁,而且解释得很好,但也有缺点。@ibrahimmahir@JeffrinJohn不客气!我很高兴能帮上忙。@ibrahm mahrir:getName函数不能处理我发现的以下两种情况。I)当函数和之间有空格时(.Example:var-sampleFunc=function(){};ii)当变量名中包含function关键字时。Example:var-functionName=“sampleFunc”;如何更新getName函数以处理这两种情况。
<script src="path/to/accorn.js"></script>
<script src="path/to/walk.js"></script>
function getFunctionNames(codeString) {
    var names = [];
    acorn.walk.simple(acorn.parse(codeString), {
        AssignmentExpression: function(node) {
            if(node.left.type === "Identifier" && (node.right.type === "FunctionExpression" || node.right.type === "ArrowFunctionExpression")) {
                names.push(node.left.name);
            }
        },
        VariableDeclaration: function(node) {
            node.declarations.forEach(function (declaration) {
                if(declaration.init && (declaration.init.type === "FunctionExpression" || declaration.init.type === "ArrowFunctionExpression")) {
                    names.push(declaration.id.name);
                }
            });
        },
        Function: function(node) {
            if(node.id) {
                names.push(node.id.name);
            }
        }
    });
    return names;
}