Сопоставьте все функции с документацией перед ними - PullRequest
0 голосов
/ 08 октября 2019

Я пишу простую функцию nodejs для циклического перебора базы кода, чтения всех файлов, поиска функций javascript и создания отчетов, если для этой функции написана документация.

Я написал функцию, которая обнаруживаетДля всех функций (и их контекста) я также написал отдельную функцию для обнаружения блоков документации:

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

Это должно соответствовать любому формату документа в следующем формате:

/**
 * @description - some description
 */

В принципе, я не могу понять, как объединить их обоих, я хочу сообщить о функциях, которые имеют и не имеют прикрепленных к ним документов:

Проверено в regex101: https://regex101.com/r/WGqfm8/9/

1 Ответ

0 голосов
/ 09 октября 2019

Во-первых, регулярное выражение для вашего комментария может быть уменьшено до:

/\/\*\*(\S|\s)*?\*\//g

, но это может быть лучше, если вы ищете более одного:

/\/\*\*(?:(\S|\s)(?!\*\/))*?(\S|\s)\*\//g

SecondВозможно, вам придется сделать это в двух частях:

Шаг 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 - начало строки функции.

...