Javascript 将所有函数与前面的文档相匹配

Javascript 将所有函数与前面的文档相匹配,javascript,regex,ecmascript-6,pattern-matching,match,Javascript,Regex,Ecmascript 6,Pattern Matching,Match,我正在编写一个简单的nodejs函数来循环代码库,读取所有文件,查找javascript函数,并报告该函数是否有为其编写的文档 我编写了一个函数来检测所有函数(及其上下文),我还编写了一个单独的函数来检测文档块: (\/\*\*([\S\S]*?)(?:\S)?\*\/) 这应与以下格式中的任何文档格式相匹配: /** * @description - some description */ 基本上,我不知道如何将两者结合起来,我想报告有文档和没有文档的函数: 在regex101中进行了测

我正在编写一个简单的nodejs函数来循环代码库,读取所有文件,查找javascript函数,并报告该函数是否有为其编写的文档


我编写了一个函数来检测所有函数(及其上下文),我还编写了一个单独的函数来检测文档块:

(\/\*\*([\S\S]*?)(?:\S)?\*\/)

这应与以下格式中的任何文档格式相匹配:

/**
 * @description - some description
 */
基本上,我不知道如何将两者结合起来,我想报告有文档和没有文档的函数:


在regex101中进行了测试:

首先,您的注释匹配regex可以简化为:

/\/\*\*(\S|\s)*?\*\//g
但如果您要搜索多个:

/\/\*\*(?:(\S|\s)(?!\*\/))*?(\S|\s)\*\//g
第二,您可能需要分两部分进行:

步骤1:使用
{string}.match()
创建所有匹配函数的数组

步骤2:使用
{string}.split()
删除所有匹配的函数,留下其余的代码。然后还可以使用
.map()
对其进行分解

大概是这样的:

var functions = code.match(funcRegex);
var restOfCode = code.split(funcRegex).map(c=>c.match(/\/\*\*(?:(\S|\s)(?!\*\/))*?(\S|\s)\*\//g));
注意:
restOfCode
的每一项都是一组注释,最后一项应该是函数前面的注释。例如,对于函数体
functions[0]
,您将检查数组
restOfCode[0][restOfCode[0].length-1]
中的最后一项是否以“/**”和“*/”开头和结尾

警告:大多数正则表达式在某些情况下无法得到保护,例如:

var b=`
function(){ }
`;
没有一个正则表达式是万无一失的,但它可以帮助将代码分解为多个部分以正确解析。对于简单的情况,尽管这可能是好的

顺便说一句:您确实要求“同时加入它们”,但在您的问题中没有明确给出这两个正则表达式。是的,我知道它们已经结合在一起了,但你的问题应该很清楚

因为用正则表达式解析函数体是件傻事,所以可以说,这里有一个方法至少可以将注释与函数开始部分匹配:

/^(\/\*\*(?:(?:\S|\s)(?!\*\/))*?(?:\S|\s)?\*\/\s*)?((?:(?:const|var|let).*{.*})?[^}\n]*(?:\(.*\).*{))/gm


第1组返回文档注释(如果存在),第2组返回函数的起始行。

谢谢,应该可以让我大致了解到这一点,但是您的表达式与我的演示文稿中的所有函数都不匹配,这应该是您的问题。您不应该链接到问题之外的额外要求。我很快会再看一眼。“我已经写了一个检测所有函数的函数”-这是我的问题,我会假设如果其他人正在做某件事,他们应该保留他们已经说过的功能,但仍停留在一个特定的部分上,不需要否决我我没有否决你,其他人做了。我的意思是,我确信我可以想出许多方法来布置函数(关于
新函数(…)
?)呢)。我不知道,因为要求不是很清楚。您应该在问题中有明确的要求,而不是链接到一段代码,其中包含可能的函数格式列表,在将来的任何时候,正则表达式都会失败,因为您没有预见到某些场景。所有场景都应该在您的问题中,而不是链接到外部代码(如果站点曾经关闭,这些代码可能在将来不存在)。这很可能是其他人投票否决它的原因。顺便说一句:一开始就不应该使用正则表达式,但我正在尽我最大的努力看看它能走多远。