正则表达式毫秒

时间:2015-08-28 05:48:45

标签: c# regex

我想在像这样的文件中找到日期时间模式

  

Blah blah blah 2015-08-28 08:40:34,100 blah blah blah 2015-08-28 08:40:34,124 blah blah blah ....

我正在使用这种模式

 string pattern =
 @"(?<logDate>(\d){4}-(\d){2}-(\d){2}\s(\d){2}:(\d){2}:(\d){2})";

有人可以建议如何将milliseconds部分添加到此regex吗?

3 个答案:

答案 0 :(得分:2)

您可以在最后添加可选的millisec模式:

string pattern = @"(?<logDate>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}(?:,\d{3}\b)?)";

(?:,\d{3})?将使millisec部分保持可选,这是3位数后跟逗号。

PS:无需使用(\d)将其设为捕获组。

答案 1 :(得分:0)

我会使用DateTime.ParseExactDateTime.TryParseExact代替正则表达式

var dt = DateTime.ParseExact("2015-08-28 08:40:34,100", "yyyy-MM-dd HH:mm:ss,fff", null);

答案 2 :(得分:0)

我建议使用单词边界而不是行尾锚,以确保在字符串末尾的逗号后面正好有3位数字:

(?<logDate>\b\d{4}-\d{2}-\d{2}\p{Zs}\d{2}:\d{2}:\d{2}(?:,\d{3}\b)?)
            ^                  ^^^^^                           ^ ^

请参阅RegexStorm demo

这里,\b确保在秒之后只有3毫秒的前一个逗号。另外,我将\s替换为\p{Zs}以仅匹配空格,而不是换行符号。

最后的问号表明非捕获组(?:,\d{3}\b)?是可选的,因此所有日期时间值(有毫秒数和无毫秒数)都将匹配。

enter image description here