返回正则表达式匹配作为拆分(或等效功能)的一部分

时间:2012-10-17 17:05:50

标签: c# regex

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

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

3 个答案:

答案 0 :(得分:1)

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

这是通过zero-width look-ahead

完成的
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,它将返回文件中的所有匹配项,可能更容易使用。

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

美好的一天