我有一组包含数百行数据的日志。我想在给定字符串的两次出现之间拉取数据(例如:“LOGS ARE CLEARED”)并在给定开始日期和结束日期的特定时间段内(例如:“05/01/2013”到“05/17 /”) 2013" )
可能的字符串示例:
113 * 05/01/2013 * 16:10 1234 * 1 *(Iw(1 * 0,M-00,R-100110021 A / C OPERATION) OK * 121 * 05/01/2013 * 16:28日志被清除114 * 05/01/2013 * 16:38 1234 * 1 *(Iw(1 * 0,M-00,R-100110021 A / C * 120 * 05/11 / 2013 * 18:36 1234 * 1 *(Iw(1 * 1,M-00,R-100110021 A / C CUSTOMER * 126 * 05/12/2013 * 06:12 1234 * 1 *(Iw(1 * 0,M-00,R-100110021 A / C OPERATION OK * 130 * 05/18/2013 * 07:37 1234 * 1 *(Iw(1 * 7,M-00,R-100110021 A / C BILLS * 134 * 05/18/2013 * 10:44日志已清除133 * 05/18/2013 * 13:34 * 1234 * 1 *(Iw(1 * 0,M-00,R-100110021 A / C OPERATION
如何通过C#.net中的简单设计实现这一目标,并且只能通过一个常规表达式实现吗?
答案 0 :(得分:0)
您示例中的模式为:
05/01/2013。日志已清除(。)日志已清除。* 05/17/2013
然而,我无法想象一种效率较低的方法。如果日志中不存在开始日期或结束日期,它也会失败。
是否有可能日志被换行符分隔,以便您可以逐行解析?
答案 1 :(得分:0)
试试这个:
string logContent = @"113*05/01/2013*16:10 1234*1*(Iw(1*0, M-00, R-100110021 A/C OPERATION OK *121*05/01/2013*16:28 LOGS ARE CLEARED 114*05/01/2013*16:38 1234*1*(Iw(1*0, M-00, R-100110021 A/C *120*05/11/2013*18:36 1234*1*(Iw(1*1, M-00, R-100110021 A/C CUSTOMER *126*05/12/2013*06:12 1234*1*(Iw(1*0, M-00, R-100110021 A/C OPERATION OK *130*05/18/2013*07:37 1234*1*(Iw(1*7, M-00, R-100110021 A/C BILLS *134*05/18/2013*10:44 LOGS ARE CLEARED 133*05/18/2013*13:34 *1234*1*(Iw(1*0, M-00, R-100110021 A/C OPERATION";
Regex reg = new Regex(@"(?s)(?<start>\d{2}/\d{2}/\d{4})\*\d{2}:\d{2} LOGS ARE CLEARED(?<content>.*?)\s*\*?\d+\*(?=(?<end>\d{2}/\d{2}/\d{4})\*\d{2}:\d{2} LOGS ARE CLEARED)");
MatchCollection mc = reg.Matches(logContent);
foreach (Match m in mc) {
Console.WriteLine("start date: " + m.Groups["start"]);
Console.WriteLine("content: " + m.Groups["content"]);
Console.WriteLine("end date: " + m.Groups["end"]);
}
Console.Read();
答案 2 :(得分:0)
尝试这种模式:
(?&lt; = LOGS CLEARED)。*(?&lt; = 05/01/2013)。+(?= 05/12/2013)。*?(?= LOGS已清除)
您需要在日期中转义斜杠。不知道为什么当我发帖的时候不会出现。
如果日期在那里,它将在“LOGS ARE CLEARED”之间取得所有内容。