Регулярное выражение для поиска предупреждений и ошибок в выводе компилятора

2

Я новичок в С#. Мне нужно написать метод, который принимает файл журнала, созданный выходом компиляции, и вычисляет количество ошибок и предупреждений. Мне нужно отсканировать каждую строку журнала и найти следующее совпадение:  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 из строки? благодаря Тони

Теги:

4 ответа

1
Лучший ответ
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;
} 
  • 0
    Я думаю, что у вас есть ошибочная фигурная скобка в цикле между второй и третьей строками. Кроме того, вам нужно Convert.ToInt16 значения, если вы хотите добавить их.
  • 0
    Я проверил этот код и работает просто отлично (с исправлением скобок и Convert.ToInt16. Спасибо всем за вашу помощь. Тони
Показать ещё 1 комментарий
2

Вот небольшой пример:

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"
  • 0
    Спасибо за быстрый ответ. Как я могу извлечь цифры? Не могли бы вы показать, как его использовать? Спасибо
  • 0
    Вам нужны ошибки и предупреждения из последующих строк или вам просто нужны цифры из списка на первой строке?
0

Никогда не работая на С#, я могу только посоветоваться о самом регулярном выражении:

^\d*>?(Compile complete|Process_Math) -{1,2} (\d+) error\(?s\)?, (\d+) warning\(?s\)?

Это соответствует строке, которая может начинаться с числа, захватывает ведущий текст в первой группе захвата и фиксирует количество ошибок и предупреждений во второй и третьей группах захвата соответственно.

0

Этот пример хорошо подходит для ошибок:

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;
                }
            }
        }
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню