我需要一个非常灵活的时间正则表达式

时间:2012-12-12 15:04:50

标签: .net regex parsing datetime

我正在为这些模式创建一个正则表达式:

[num] [am]
[num] [pm]
[num] [-] [num]
[num] [:] [num]

带或不带空格

确定句子中是否有时间。理想情况下,它实际上会解析时间。句子就像:

“This event is at 9am at…”
“Blues, 5:30, pressroom..”
“Meet at 5pm!”
“All night 9-8 rockin’ it!”

我的项目是在.NET中,以防它相关。

3 个答案:

答案 0 :(得分:1)

我不想拥有一个灵活的正则表达式,而是更喜欢多个正则表达式(一种是你想要匹配的每种类型的模式,最有可能),然后应用每一种,直到你得到一个匹配。请注意,您可以使用此方法来识别模糊的时间规范。

这种方法更易于编码和维护(将来您可能需要更多时间格式,添加新的特定正则表达式而不是修改已经复杂/灵活的正则表达式是微不足道的。)

答案 1 :(得分:1)

根据你的定义,我认为这样的事情和你能做的一样好:

"\\b(1[012]|[1-9])(\\s?(am|pm)|:[0-5][0-9]|-(1[012]|[1-9]))\\b"

这要求一小时在1-12和分钟之间为0-59。它还需要在时间周围的字边界。它不允许在破折号或冒号周围留出空格。

然而,根据定义,你会得到很多误报,特别是你的[num]-[num]格式,看起来很像日期和其他东西。

经过测试here。我没有找到特定的.NET测试程序,但我认为它都是标准的。

答案 2 :(得分:0)

从“语法”构建正则表达式非常简单,有a look at RegExes

/(\d{1,2})\s*([:-]\s(\d{1,2})|am|pm)/

我限制你的数字直到2个字符长,你可能会省略,因为你可能会看看时间是否在有效范围内。要解析匹配的字符串,可以从结果中提取匹配的组。