0

我正在尝试解析一些日志文件并将它们放入数据库进行分析。一行看起来像这样:

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}");
            ...
}
4

3 回答 3

1

Split()将始终删除匹配的分隔符。诀窍不是匹配任何实际的text,而是匹配字符串中的一个位置

这是通过零宽度前瞻完成的:

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);
于 2012-10-17T17:27:12.920 回答
0

好吧,我不是这方面的专家,但我确实发现了这个:Regex.Match

从我看到的情况来看,您可以使用 Match 对象接收日期格式的第一个匹配项,该对象具有各种很好的属性,您可以将它们组合在一起,您可以剪切您想要的部分。

ps 还存在一个 Regex.Matches ,它将返回文件中的所有匹配项,可能更易于使用。

抱歉,我没有时间找到完整的代码示例。

再会

于 2012-10-17T17:36:42.603 回答
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

于 2012-10-17T17:21:32.340 回答