仅使用一个正则表达式拉取数据

时间:2013-05-17 10:39:03

标签: c# regex

我有一组包含数百行数据的日志。我想在给定字符串的两次出现之间拉取数据(例如:“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中的简单设计实现这一目标,并且只能通过一个常规表达式实现吗?

3 个答案:

答案 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”之间取得所有内容。