结合相同的日志并使用正则表达式添加计数

时间:2014-02-20 21:49:46

标签: c# regex

在C#中,我想使用正则表达式来组合相同的行并在行尾添加计数

这是我的日志文字:

"000-00-0000" invalid ssn (1)
"111-******" invalid ssn (1)
"000-00-0000" invalid ssn (2)
"55/22/2009" invalid date (1)
"55/22/2009" invalid date (1)
"55/22/2009" invalid date (3)

我想用此替换

"000-00-0000" invalid ssn (3)
"111-******" invalid ssn (1)
"55/22/2009" invalid date (5)

我需要一个正则表达式模式来计算匹配并得到每个匹配的数量并将它们相加

在每行添加到日志

之前,我使用以下代码
string error; // for example error = "000-00-0000" invalid ssn (1)
 if (log_errors.Contains(error)) // log_errors is my whole logs string
 {
 string pat = @"\b(" + error_string + " ([0-9]))" + @"\b";
 Match match = Regex.Match(log_errors, pat , RegexOptions.IgnoreCase);
  if (match.Success)
  {
   // Remove the line and add one to the same that already exist
  } 
 }

感谢您的帮助

2 个答案:

答案 0 :(得分:4)

如果唯一的括号在行数附近,则可以使用LINQ并拆分:

var newLog = (from log in log_errors
              let s = log.Split('(', ')')
              group s by s[0] into g
              select string.Concat(g.Key, "(", g.Sum(x => int.Parse(x[1])), ")"));

这将在新的字符串列表中存储您想要的内容。 (我针对你的样本数据运行它。)

"000-00-0000" invalid ssn (3)
"111-******" invalid ssn (1)
"55/22/2009" invalid date (5)

答案 1 :(得分:1)

您可以通过正则表达式描述行日志结构并逐行解析:

var result = 
  log_errors.Select(line => Regex.Match(line, @"("".*"")(.*)\((\d+)\)").Groups)
            .Select(gc => new 
             {
                Id = gc[1].Value, 
                Text = gc[2].Value,
                Count = int.Parse(gc[3].Value)
             })
            .GroupBy(x => x.Id + x.Text, 
                    (k,v) => string.Format("{0} ({1})", k, v.Select(i => i.Count).Sum()))
            .ToList();