2012-09-15 51 views
1

我刚刚尝试过几百个(如果不是几千...)RegEx的可用来获得我想要的...但他们都没有工作。Timespan-Regex with Days-Portion

我只是在寻找一个正则表达式,它表示一个时间跨度days.hours:minutes:seconds: 7.00:00:00将表示 “7天”

这一个可悲的是不起作用:

(\d\d).(\d\d):(([0-6][0])|([0-5][0-9])):(([0-6][0])|([0-5][1-9]))

回答

1

这是因为你的正则表达式模式期待2位数天,而你只有1位数。只需让第一个数字可选?

(\d?\d)\.(\d\d):(60|([0-5][0-9])):(60|([0-5][0-9])) 

或更好,但只使用+匹配一个或更多,因为这种模式仍然不匹配100天

(\d+)\.(\d\d):(60|([0-5][0-9])):(60|([0-5][0-9])) 
+0

哦,你当然是对的......谢谢! :) – SeToY

3

这一个是技术上更正确,可能更有效得:

\d+\.((0?\d)|(1\d)|(2[0-3]))(:[0-5]\d){2} 
+0

由于某些原因,SO只显示反斜杠点(删除反斜杠),所以我在编辑时放置了一个额外的反斜杠,现在输出显示正确。 – dotNET

+0

编辑答案将表达式显示为代码。 – Bas

1

接受的答案似乎不适用于基本情况。

TimeSpan parsing rule我想出了这种模式。

^((?:-?0*\d+\.)?(?:0*)(?:2[0-3]|1[0-9]|[0-9]))(?::0*([0-5]?[0-9]))?(?::0*((?:[0-5]?[0-9])(?:\.\d{0,7})?))?$

注意这种模式将通过10.12格式,而MSDN标志着这是一个无效的格式。这应该是IMO的有效格式。

+0

这是正确的答案。 –