Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 仅使用一个正则表达式提取数据_C#_Regex - Fatal编程技术网

C# 仅使用一个正则表达式提取数据

C# 仅使用一个正则表达式提取数据,c#,regex,C#,Regex,我有一组日志,其中包含数百行数据。我想在给定字符串的两个事件(例如:“日志已清除”)之间以及给定开始日期和结束日期(例如:“2013年1月5日”到“2013年17月5日”)的特定期间内提取数据 可能的字符串示例: 113*05/01/2013*16:10 1234*1*(Iw(1*0,M-00,R-100110021空调操作 OK*121*05/01/2013*16:28日志已清除114*05/01/2013*16:38 1234*1*(Iw(1*0,M-00,R-100110021 A/C*1

我有一组日志,其中包含数百行数据。我想在给定字符串的两个事件(例如:“日志已清除”)之间以及给定开始日期和结束日期(例如:“2013年1月5日”到“2013年17月5日”)的特定期间内提取数据

可能的字符串示例:

113*05/01/2013*16:10 1234*1*(Iw(1*0,M-00,R-100110021空调操作 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空调客户*126*05/12/2013*06:12 1234*1*(Iw(1*0,M-00,R-100110021空调运行正常 *130*05/18/2013*07:37 1234*1*(Iw(1*7,M-00,R-100110021空调账单*134*05/18/2013*10:44日志被清除133*05/18/2013*13:34*1234*1*(Iw(1*0,M-00,R-100110021空调操作


如何在C#.net中通过简单设计实现这一点,以及如何仅通过一个正则表达式实现这一点?

您的示例中的模式是:

2013年1月5日。日志已清除(.)日志已清除。*2013年5月17日

但是,我无法想象一种效率更低的方法。如果日志中没有开始日期或结束日期,那么它也会失败

日志是否有可能由换行符分隔,以便您可以逐行分析?

尝试以下操作:

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();
string logContent=@“113*05/01/2013*16:10 1234*1*(Iw(1*0,M-00,R-100110021 A/C操作正常*121*05/01/2013*16:28日志被清除114*05/01/2013*16:38 1234*1*(Iw(1*0,M-00,R-100110021 A/C*120*11/2013*18:36 1234*1*(Iw(1*1,M-00,R-100110021 A/C客户126/12/2013*06*1*)(1*0,M-00,R-100110021空调运行正常*130*05/18/2013*07:37 1234*1*(Iw(1*7,M-00,R-100110021空调账单*134*05/18/2013*10:44日志被清除133*05/18/2013*13:34*1234*1*(Iw(1*0,M-00,R-100110021空调运行);
Regex reg=newregex(@“(?s)(?\d{2}/\d{2}/\d{4})\*\d{2}:\d{2}日志被清除(?.*?\s*\*?\d+\*(?=(?\d{2}/\d{2}/\d{4})\*\d{2}:\d{2}日志被清除”);
MatchCollection mc=reg.Matches(日志内容);
foreach(在mc中匹配m){
Console.WriteLine(“开始日期:+m.Groups[“开始”]);
Console.WriteLine(“内容:+m.Groups[“内容”]);
Console.WriteLine(“结束日期:+m.Groups[“结束”);
}
Console.Read();
尝试以下模式:


(?您应该给出一个示例字符串来显示日期在哪里请编辑您的答案并向其中添加新信息。我们不能这样阅读。然后删除注释。@Storm:如果只是剪切和粘贴的问题,我会自己修复它。不幸的是,有几个字符被删除,因为这是一个错误s标记。只有OP知道数据的外观。正则表达式在匹配文本模式方面非常出色,但在日期比较方面却不行。您可以使用一个正则表达式将数据提取出来,但无法以这种方式筛选数据。请利用此网站出色的代码格式化功能()。这样您就不用担心反斜杠不显示。顺便说一句,
/
不需要转义。