首页 > 解决方案 > 将所有函数与之前的文档匹配

问题描述

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

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

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

这应该匹配以下格式的任何文档格式:

/**
 * @description - some description
 */

基本上我不知道如何加入它们,我想报告有和没有附加文档的函数:

已在 regex101 中进行测试:https ://regex101.com/r/WGqfm8/9/

标签: javascriptregexecmascript-6pattern-matchingmatch

解决方案


首先,您的评论匹配正则表达式可以简化为:

/\/\*\*(\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

https://regex101.com/r/WGqfm8/15

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


推荐阅读