具有增量的小时的正则表达式(RegEx)

时间:2014-02-18 16:17:21

标签: regex coldfusion

我只需要接受符合这些规则的输入......

  1. 0.25-24
  2. .25(.00,。25,.50,。75)
  3. 的增量
  4. 不一定要求第一个数字。
  5. 希望尾随零是可选的。
  6. 一些有效条目的示例:

    1. 0.25
    2. 0.50
    3. 0.5
    4. 1
    5. 1.0
    6. 5.50
    7. 23.75
    8. 24(允许的最大数量)
    9. 更新:什么都没有,空/空白,也应该被视为有效
    10. 一些无效条目的示例:

      1. 0
      2. 0.0
      3. 0.00
      4. 0.0
      5. 0.00
      6. 24.25
      7. -1
      8. 我知道RegEx是一种模式匹配语言,因此它对于范围,小于和大于检查并不是很好。所以要检查它是否小于或等于24意味着我必须找到一个模式,对吧?所以有24种可能的模式可以使这个很长的RegEx,我能正确理解吗?我可以使用ColdFusion进行检查以确保它在0-24范围内。如果我在这部分使用ColdFusion,那么这不是世界末日,但如果它不会导致它过长,那么将它全部放入RegEx会很好。这就是我到目前为止所做的:

        ^\d{0,2}((\.(0|00|25|5|50|75))?)$

        http://regex101.com/r/iS7zM3

        除了0-24范围检查或仅检查零之外,它几乎可以处理所有这些。我会继续关注它,但任何帮助将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:6)

\d{0,2}更改为(?:1[0-9]?|2[0-4]?|[3-9])?,它将匹配1到24(或无)。

您还可以将第二部分简化为(?:\.(?:00?|25|50?|75))? - 您可以更进一步(?:\.(?:[05]0?|[27]5))?,但这可能会使意图模糊不清。

要排除24.25,您可以使用否定前瞻(?!24\.[^0])来防止24.0或24.00以外的任何内容,但是从主模式中排除24并包含24 / 24.0 / 24.00的特定检查可能更简单在开始时:

(?x)
    # checks for 24
    ^24$|^24\.00?$
    |
    # integer part
    ^
    (?:1[0-9]?|2[0-3]?|[3-9]|0(?=\.[^0])|(?=\.[^0]))
    # decimal part
    (?:\.(?:00?|25|50?|75))?
    $

还包括对0(?=\.[^0])的检查,如果下一个字符为0后跟非零({0.0},则使用正向前瞻只允许初始.不允许0.00。)

(?x)标志允许忽略空格,允许在代码中使用可读的正则表达式 - 显然比将它们压缩到一行更好 - 并且还允许使用#来启动行注释解释模式的一部分。 (文字空格和散列可以使用反斜杠进行转义,或者通过例如\x23进行编码以进行散列。)

为了比较,这是一种纯CFML方式:

IsNumeric(Num)
AND Num GT 0
AND Num LTE 24
AND NOT find('.',Num*4)

现在,你真的确定它作为一个正则表达式更好......

答案 1 :(得分:3)

你可以尝试这个正则表达式(细分):

^
(?:
(?:[1-9]|1\d|2[0-3])(?:\.(?:[05]0?|[27]5))?   # Non-zeros with optional decimal
|
0?(?:\.(?:50?|[27]5))                         # Decimals under 1
|
24(?:\.00?)?                                  # The maximum
)
$

在一行中:

^(?:(?:[1-9]|1\d|2[0-3])(?:\.(?:[05]0?|[27]5))?|0?(?:\.(?:50?|[27]5))|24(?:\.00?)?)$

regex101 demo

答案 2 :(得分:0)

^([0-1]?[0-9]|2[0-4])((\.(0|00|25|5|50|75))?)$

这意味着如果缺少十位,一个0或1,那个位置可以是0-9。

如果十位是2,则那个位置可以是0-4。

第二部分很棒,它也很简单易读。它有一套额外的parens虽然可以删除,减少它:

^([0-1]?[0-9]|2[0-4])(\.(0|00|25|5|50|75))?$