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;
}