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

gfr*_*ius 3 regex coldfusion

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

  1. 0.25-24
  2. .25(.00,.25,.50,.75)的增量
  3. 不需要第一个数字.
  4. 希望尾随零是可选的.

一些有效条目的示例:

  1. 0.25
  2. 0.50
  3. 0.5
  4. 1
  5. 1.0
  6. 5.50
  7. 23.75
  8. 24(允许的最大值)
  9. 更新:什么都没有,null/blank,也应该被接受为有效

一些无效条目的示例:

  1. 0
  2. 0.0
  3. .00
  4. 0.0
  5. 0.00
  6. 24.25
  7. -1

我知道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范围检查或仅检查零之外,它几乎可以处理所有这些操作.我会继续关注它,但任何帮助将不胜感激.谢谢!

Pet*_*ton 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))?
    $
Run Code Online (Sandbox Code Playgroud)

这还包括一个检查,如果下一个char 后跟非零(因此不允许0.0和0.00)0(?=\.[^0]),则使用正向前瞻仅允许初始化.0.

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

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

IsNumeric(Num)
AND Num GT 0
AND Num LTE 24
AND NOT find('.',Num*4)
Run Code Online (Sandbox Code Playgroud)

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