Я новичок в С#. Мне нужно написать метод, который принимает файл журнала, созданный выходом компиляции, и вычисляет количество ошибок и предупреждений. Мне нужно отсканировать каждую строку журнала и найти следующее совпадение: x ошибка (ы), y предупреждение (ы)
Примеры таких шаблонов:
Compile complete -- 1 errors, 213 warnings 6>Process_Math - 3 error(s), 1 warning(s) 24>Process_Math - 1 error(s), 0 warning(s)
Как я могу написать алгоритм, который находит этот шаблон и извлекает x и y из строки? благодаря Тони
int errors = 0;
int warnings = 0;
Regex regexObj = new Regex(@"(?<errors>\d+) error\(s\), (?<warnings>\d+) warning\(s\)", RegexOptions.Multiline);
Match matchResults = regexObj.Match(input);
while (matchResults.Success)
{
errors = errors + Convert.ToInt16(matchResults.Groups["errors"].Value);
warnings = warnings + Convert.ToInt16(matchResults.Groups["warnings"].Value);
matchResults = matchResults.NextMatch;
}
Вот небольшой пример:
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
String input = @"Compile complete -- 1 errors, 213 warnings
6>Process_Math - 3 error(s), 1 warning(s)
24>Process_Math - 1 error(s), 0 warning(s)";
Regex regex = new Regex(@"(\d+)\serrors?,\s(\d+)\swarnings?",
RegexOptions.Compiled |
RegexOptions.CultureInvariant |
RegexOptions.IgnoreCase |
RegexOptions.Multiline);
Match match = regex.Match(input);
if (match.Success)
{
Console.WriteLine("errors: " + match.Groups[1].Value);
Console.WriteLine("warnings: " + match.Groups[2].Value);
}
}
}
Это будет захватывать ошибки и предупреждения из первой строки, а не последующих.
Вот прокомментированная версия регулярного выражения, которая поможет объяснить, как это работает:
(\d+) # capture any digit, one or more times
\s # match a single whitespace character
errors?, # match the string "error" or "errors" followed by a comma
\s # match a single whitespace character
(\d+) # capture any digit, one or more times
\s # match a single whitespace character
warnings? # match the string "warning" or "warnings"
Никогда не работая на С#, я могу только посоветоваться о самом регулярном выражении:
^\d*>?(Compile complete|Process_Math) -{1,2} (\d+) error\(?s\)?, (\d+) warning\(?s\)?
Это соответствует строке, которая может начинаться с числа, захватывает ведущий текст в первой группе захвата и фиксирует количество ошибок и предупреждений во второй и третьей группах захвата соответственно.
Этот пример хорошо подходит для ошибок:
using System;
using System.Text.RegularExpressions;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string compilationOutput =
"Compile complete -- 1 errors, 213 warnings" +
"Compile complete -- 2 errors, 213 warnings" +
"Compile complete -- 3 errors, 213 warnings" +
"Compile complete -- 4 errors, 213 warnings";
string pattern = @"(\d+) error(:?s)?";
MatchCollection results = Regex.Matches(compilationOutput, pattern, RegexOptions.IgnoreCase);
int errors = 0;
foreach (Match m in results)
{
int error;
if (int.TryParse(m.Groups[1].Value, out error))
{
errors += error;
}
}
}
}
}