按日期时间值将字符串拆分为子字符串

时间:2014-03-02 08:32:57

标签: c# regex pattern-matching

我有一个

类型的字符串
  

2014-02-19 16:21:46,139 ERROR queue.TaskQueueEngine - 失败了   解决第一级故障检测任务的任务队列条目   java.sql.SQLException:网络错误IOException:连接定时   out:connect 2014-02-19 16:35:48,247 ERROR [pool-1-thread-1]   cluster.ClusterServiceImpl - 尝试更新时出现意外错误   LastCheckinTime java.sql.SQLException:网络错误IOException:   连接超时:连接

...

我试图通过例如日期时间值将其拆分为子串。

  

log [0] = 2014-02-19 16:21:46,139 ERROR queue.TaskQueueEngine - 失败   解决第一级故障检测任务的任务队列条目   java.sql.SQLException:网络错误IOException:连接定时   out:connect

     

log [1] = 2014-02-19 16:35:48,247 ERROR [pool-1-thread-1]   cluster.ClusterServiceImpl - 尝试更新时出现意外错误   LastCheckinTime java.sql.SQLException:网络错误IOException:   连接超时:连接

我正在使用以下命令

string exLogs = System.IO.File.ReadAllText(@"D:\orion.log");
string[] messages = Regex.Split(exLogs,] @"^([0-9]{4})-([0-1][0-9])-
         ([0-3][0-9])\s([0-1][0-9]|[2][0-3]):([0-5][0-9]):([0-5][0-9])");

然而,不是给我子串,而是给了我

log[0]=2014
log[1]=02

等。 我能做错什么? 非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

删除匹配器的^表单开头。

正则表达式中的

^ 表示匹配必须从字符串或行的开头开始。

试试这个:

string[] messages = Regex.Split(exLogs,
    "([0-9]{4}-[0-1][0-9]-[0-3][0-9]\\s(?:[0-1][0-9]|[2][0-3]):[0-5][0-9]:[0-5][0-9])");

答案 1 :(得分:0)

我认为这将分为两个部分:

首先得到分裂:

string[] dateAndTime = tex.Split(' ');

然后在他自己的字符串中获取每个日期和时间]:

string[] date = dateAndTime[0].Split('-');
string[] time = dateAndTime[1].Split(':');

我希望这会有所帮助

答案 2 :(得分:-1)

这里发生了一些事情 - 你正在使用许多你不需要捕获的parens - 这些导致每个捕获paren的结果作为单独的结果返回。其中大部分都不是必需的 - 唯一需要的是用于小时比赛的那个,它可以变成非捕获用的。

第二 - 您正在将正则表达式锚定到行的开头(^) - 这意味着它永远不会与日志中间的日期匹配。

第三 - 您对\s的使用与多个空格不匹配 - 您应该使用\s+

第四 - 拆分不会返回拆分的值。

我删除了大部分捕获的parens,添加了一小时的无捕获,删除了起始锚点,并将空间匹配器更改为\s+

我把整个东西包裹在一个paren中以返回日期值:

@"([0-9]{4}-[0-1][0-9]-[0-3][0-9]\s+(?:[0-1][0-9]|[2][0-3]):[0-5][0-9]:[0-5][0-9])"

这将返回一个数组,其中第一个项为空(第一个日期之前),然后是日期,然后是日志错误,然后是日期,然后是日志错误。