Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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_Pattern Matching - Fatal编程技术网

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

C# 按日期时间值将字符串拆分为子字符串,c#,regex,pattern-matching,C#,Regex,Pattern Matching,我有一个类型的字符串 2014-02-19 16:21:46139错误queue.TaskQueueEngine-未能 解析第一级故障检测任务的任务队列条目 java.sql.SQLException:网络错误IOException:连接超时 输出:connect 2014-02-19 16:35:48247错误[pool-1-thread-1] cluster.ClusterServiceImpl-尝试更新时出现意外错误 LastCheckinTime java.sql.SQLExceptio

我有一个类型的字符串

2014-02-19 16:21:46139错误queue.TaskQueueEngine-未能 解析第一级故障检测任务的任务队列条目 java.sql.SQLException:网络错误IOException:连接超时 输出:connect 2014-02-19 16:35:48247错误[pool-1-thread-1] cluster.ClusterServiceImpl-尝试更新时出现意外错误 LastCheckinTime java.sql.SQLException:网络错误IOException: 连接超时:连接

我试图将其按日期时间值拆分为子字符串,例如

日志[0]=2014-02-19 16:21:46139错误队列。TaskQueueEngine-失败 解析第一级故障检测任务的任务队列条目 java.sql.SQLException:网络错误IOException:连接超时 输出:连接

日志[1]=2014-02-19 16:35:48247错误[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
等等。 我可能做错了什么。
非常感谢您的帮助。

删除
^
从matcher开始

在正则表达式中,表示匹配必须从字符串或行的开头开始

试试这个:

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])");

这里发生了一些事情-您正在使用许多不需要的捕获参数-这些导致每个捕获参数的结果作为单独的结果返回。其中大部分是不需要的-唯一需要的是用于小时匹配的,它可以更改为非捕获参数

第二,你将正则表达式锚定到行的开始(<代码> ^ < /代码>),这意味着它永远不会匹配日志中间的日期。

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

第四次分割不会返回分割的值

我删除了大部分捕获参数,添加了一个小时的无捕获,删除了开始锚,并将空间匹配器更改为
\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])"

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

我认为这将在两个部分中更容易实现:

首先获得拆分:

string[] dateAndTime = tex.Split(' ');
然后在各自的字符串中获取日期和时间]:

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

我希望这有帮助

这里的
意味着您的正则表达式与预期的非常不同。改用非捕获paren。谢谢这个正则表达式起作用了。我还没有完全了解正则表达式,还没有真正理解它的含义就从正则表达式库中提取了正则表达式。上面的讨论帮助我更好地理解了它。我可以在示例数据中的每个日期和时间后看到一个逗号,如果可以拆分的话它使用逗号并进行一些简单的调整以获得所需的输出。@sudhakardipudi-假设日期后的错误日志文本从不包含逗号。我会觉得很厌烦。