2009-07-26 85 views
0

我需要一个正则表达式来限制0-24小时的输入,其中小数的倍数为.25。请记住以下条件必须满足:正则表达式允许15分钟增量的小时数

  • 当整体的一部分是0-23位,小数部分可能是2.0,1.25,0.5或0.75
  • 当整体的一部分是24 ,小数部分可以是0.0
  • 当没有整体的一部分存在时,小数部分必须是0.0,0.25,0.5,或0.75
  • 空字符串不允许

我我非常有信心可以收紧以下表达方式,但这就是现实ce到目前为止:

(^(([0-9])|(1[0-9])|(2[0-3]))(\.((0*)|(250*)|(50*)|(750*)))?$)|(^24(\.0*)?$)|(^\.((0+)|(250*)|(50*)|(750*))$) 

更新:正则表达式验证存在于客户端(javascript)和服务器(asp.net,c#)上。

+0

让24.0和0.0一样不合逻辑,因为它们是同一时间。 – caf 2009-07-26 22:04:34

+0

@caf:除非你正在注册持续时间而不是时间。小时登记系统,每天或某物。我衷心希望没有人会需要使用“24”选项:) – Thorarin 2009-07-26 22:15:07

+0

当然,但0.0长度的预订听起来有点鱼腥。 – caf 2009-07-27 03:58:13

回答

11

而你为什么绝对积极​​地需要做这个正则表达式呢?转换为数字并进行一些基本检查会容易得多。

检查数字乘以4是否是自然数< = 96,完成。

根据您的个人资料判断,您可能正在使用.NET。我假设你希望这是一个正则表达式,因为你正在使用它进行客户端验证。我会认真考虑在客户端JavaScript中使用CustomValidator。

东西沿着这些线路为JavaScript的:

<script type="text/javascript"> 
function checkDuration(text) 
{ 
    var tmp = parseFloat(text) * 4; 
    return tmp >= 0 && tmp <= 96 && Math.ceil(tmp) == tmp; 
} 
</script> 

编辑:我有点担心使用花车当舍入误差,但似乎摸出好了所有可能的情况。

+0

+1:是的,即使它正在搜索匹配字符串中的条件的数字(它不是,由锚定来判断),只需要匹配数字并在回调函数中进行验证仍然会更好。 – Blixt 2009-07-26 21:32:30

+0

@Thorarin - 好主意。为了回答你的问题,Regex对我来说似乎是一个合理的选择。验证存在于客户端(javascript)和服务器(asp.net,c#)上。谢谢。 – 2009-07-26 21:46:37

+0

好东西我正在写一个JavaScript实现,你可以适应你的CustomValidator然后:) – Thorarin 2009-07-26 21:50:00

4
^((1?\d|2[0-3])?(\.(0|[27]?5)0*)|(1?\d|2[0-4])(\.0*)?)$ 
+0

+1。我更喜欢这个,因为它不使用lookbehind断言。使读取更容易,语法兼容更多的正则表达式实现。 – Thorarin 2009-07-26 22:12:28

+0

+1 - 做得很好,这比我的尝试要好得多。我将删除我的这个。 – Tomalak 2009-07-27 08:55:02