Используя регулярное выражение Роберта Харви , мне удалось создать короткий метод C #, который вычисляет эту метрику из входной строки.Он идет посимвольно для правильного учета строк, которые содержат как код, так и комментарии, а также исключает дополнительные пробелы из метрики, так что такие вещи, как отступы строк, не учитываются.
Чтобы предотвратить катастрофический откат назадЯ упростил регулярное выражение (я обнаружил, что вам не нужны проверки новой строки, поскольку группы исключения символов уже позаботились об этом), а также сделал тело комментария блока группой без возврата.
public static double CodeToCommentRatio(
string text,
out int codeChars,
out int commentChars,
out int blankChars)
{
// First, filter out excess whitespace, reporting the number of characters removed this way
Regex lineStartRegex = new Regex(@"(^|\n)[ \t]+");
Regex blanksRegex = new Regex(@"[ \t]+");
string minWhitespaceText = blanksRegex.Replace(lineStartRegex.Replace(text, "\n"), " ");
blankChars = text.Length - minWhitespaceText.Length;
// Then, match all comments and report the number of characters in comments
Regex commentsRegex = new Regex(@"(/\*(?>[^*]|(\*+[^*/]))*\*+/)|(//.*)");
MatchCollection comments = commentsRegex.Matches(minWhitespaceText);
commentChars = 0;
foreach (Match comment in comments)
{
commentChars += comment.Length;
}
codeChars = minWhitespaceText.Length - commentChars;
// Finally, return the ratio
return (double)codeChars / commentChars;
}