我正在尝试解析一些日志文件并将它们放入数据库进行分析。单行看起来像这样:
2012-09-30 17:16:27,213 [39] (boxes) ERROR Assembly.Places [(null)] - Error while displaying a thing
我已经制作了一个正则表达式,可以很好地将前面的日期拉出来并分解那条线,但是我失去了日期本身。这是一个非常重要的数据,我不想失去它!
我不能只通过\r\n
执行此操作,因为某些日志是致命错误,包括开发人员的堆栈跟踪。显然,这些使用\r\n
来使它们可读。
我目前的代码如下所示:
var logpath = Directory.GetFiles(@"C:\a\directory", "*.log");
foreach (var log in logpath)
{
var fileStream = new StreamReader(log);
var fileString = fileStream.ReadToEnd();
var records = Regex.Split(fileString, "[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3}");
...
}
答案 0 :(得分:1)
Split()
将始终删除匹配的分隔符。诀窍是不匹配任何实际的文本,而是匹配字符串中的位置。
var datePattern = "^(?=[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3})";
var datePositions = new Regex(datePattern, RegexOptions.Multiline);
// ...
Regex.Split(fileString, datePositions);
答案 1 :(得分:0)
您应该match
而不是splitting
这是正则表达式。使用singleLine
模式
([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3})(.*?)((?=[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3}|$))
第1组包含日期
第2组包含所需日期
注意强>
正则表达式在概念上就是这样。
(yourDate)(.*?yourdata)(?=till the other date|$)
别忘了使用singlelineMode
答案 2 :(得分:0)
好吧,我不是这方面的专家,但我确实找到了这个:Regex.Match。
根据我的看法,您可以使用Match对象接收日期格式的第一个匹配项 它具有各种不错的特性,可以将你想要的零件切割在一起。
P.S。还存在一个Regex.Matches,它将返回文件中的所有匹配项,可能更容易使用。
抱歉,我没时间找到完整的代码示例。
美好的一天