我想在像这样的文件中找到日期时间模式
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
吗?
答案 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.ParseExact
或DateTime.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)?)
^ ^^^^^ ^ ^
这里,\b
确保在秒之后只有3毫秒的前一个逗号。另外,我将\s
替换为\p{Zs}
以仅匹配空格,而不是换行符号。
最后的问号表明非捕获组(?:,\d{3}\b)?
是可选的,因此所有日期时间值(有毫秒数和无毫秒数)都将匹配。