2012-12-06 80 views
0

我希望我的用户能够输入时间表。 如果需要更多信息,用户用这个来表示完成任务需要多少时间,并且如果填充,它将被保存在数据库中。正则表达式匹配时间

这里是我有:

/^$|^([0-1]?[0-9]|2[0-4]):([0-5][0-9])(:[0-5][0-9])?$/ 

一个空的形式或01:30和01:30:00格式化的时间相匹配。我真的不需要秒,因为每个任务至少需要一分钟,但我试图删除它,它只是崩溃我的代码,并删除了空字符串的支持..我真的不明白正则表达式。

我想要的是匹配简单的分钟和简单的时间,如3:30,3:00,5。这是可能的吗?这将大大改善用户体验并限制浪费打字。但是我想保留零选项以防某些用户觉得输入它很自然。

+0

您使用哪种语言? –

+0

不要试图自己验证它。使用标准库作为您正在使用的任何语言。例如,在Perl中就是DateTime。匹配时间是一个不平凡的问题,它是一个解决不了的问题。更好地使用已经存在的经过良好测试的代码,而不是编写自己的代码。 –

+0

我正在使用它在JavaScript中的飞行测试和重新检查与PHP之前,它被上传到数据库。用户必须尽可能简单地以html格式输入。这是一个食谱网站,时间是烹饪和准备时间,所以我找不到任何符合我需要的东西。 –

回答

1

我觉得下面的模式你想要做什么:

p="((([01]?\d)|(2[0-4])):)?([0-5]\d)?(:[0-5]\d)?" 

第一部分:

(([01]?\d)|(2[0-3])):)? 

是一个可选的组与格式00-24小时交易。

第二部分:

([0-5]\d)? 

是一个可选的基团,如果数小时或秒中存在的表达,其与涉及分钟。该小组还处理仅包含几分钟或只有几小时的表达式。

第三部分:

(:[0-5]\d)? 

是处理秒的可选基团。

以下示例在工作显示模式:

In [180]: re.match(p,'14:25:30').string 
Out[180]: '14:25:30' 

In [182]: re.match(p,'2:34:05').string 
Out[182]: '2:34:05' 

In [184]: re.match(p,'02:34').string 
Out[184]: '02:34' 

In [186]: re.match(p,'59:59').string 
Out[186]: '59:59' 

In [188]: re.match(p,'59').string 
Out[188]: '59' 

In [189]: re.match(p,'').string 
Out[189]: '' 

由于每个组是可选的模式也匹配空字符串。我已经用Python进行了测试,但我认为它可以与其他语言一起工作,只需进行很少的更改。

+0

它的工作比我的尝试好得多。我在单分钟内仍然需要零点,但这一切都很好,因为它可能使得更清晰的时间。它工作得很好!并感谢您解释它。 –