2009-08-05 7 views
2

Je suis nouveau sur C#. J'ai besoin d'écrire une méthode qui prend un fichier journal créé par une sortie de compilation et détermine le nombre d'erreurs et d'avertissements. Je dois analyser chaque ligne du journal et trouver le match suivant: x erreur (s), avertissement y (s)Expression régulière pour trouver des avertissements et des erreurs dans la sortie du compilateur

Des exemples de ce modèles sont les suivants:

 
Compile complete -- 1 errors, 213 warnings 

6>Process_Math - 3 error(s), 1 warning(s) 
24>Process_Math - 1 error(s), 0 warning(s) 

Comment puis-je écrire l'algorithme qui trouve ce modèle et extrait x et y de la ligne? Merci Tony

Répondre

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

Je pense que vous avez une accolade errante dans la boucle while entre la deuxième et la troisième ligne. En outre, vous devez Convertir.ToInt16 les valeurs si vous souhaitez les ajouter. –

+0

J'ai testé ce code et fonctionne très bien (avec la correction des parenthèses et le Convert.ToInt16 Merci à tous pour votre aide Tony – tony

+0

@bill weaver - Correction d'erreurs basées sur vos commentaires. –

2

Voici un petit exemple:

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

Cela va récupérer les erreurs et les avertissements de la ligne première, pas les suivantes.

Voici une version commentée de l'expression régulière pour aider à expliquer comment cela fonctionne:

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

Merci pour la réponse rapide. Comment puis-je extraire les nombres? Pourriez-vous montrer comment l'utiliser? Merci – tony

+0

Avez-vous besoin des erreurs et des avertissements des lignes suivantes ou avez-vous seulement besoin des numéros de l'enroulement sur la première ligne? –

0

Ayant jamais fait de travail en C#, je ne peux que conseiller sur l'expression régulière elle-même:

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

Ceci correspond à une chaîne qui peut commencer par un nombre, capture le texte principal dans le premier groupe de capture et capture le nombre d'avertissements & dans les deuxième et troisième groupes de capture, respectivement.

0

Cet exemple fonctionne bien pour les erreurs:

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