regex - 带增量的小时的正则表达式 (RegEx)

标签 regex coldfusion

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

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

一些有效条目的示例:

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

一些无效条目的示例:

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

我知道 RegEx 是一种模式匹配语言,因此它不适用于范围、小于和大于检查。所以要检查它是否小于或等于 24 意味着我必须找到一个模式,对吗?所以有 24 种可能的模式会使这成为一个很长的正则表达式,我理解正确吗?我可以使用 ColdFusion 进行检查以确保它在 0-24 范围内。如果我在这部分使用 ColdFusion,这不是世界末日,但如果它不会导致它太长,那么将它全部放入 RegEx 会很好。这是我目前所拥有的:

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

http://regex101.com/r/iS7zM3

这几乎可以处理所有问题,除了 0-24 范围检查或仅检查零。我会继续努力,但我们将不胜感激。谢谢!

最佳答案

\d{0,2} 改成 (?:1[0-9]?|2[0-4]?|[3-9])? code> 它将匹配 1 到 24(或什么都不匹配)。

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

要排除 24.25,您也许可以使用负前瞻 (?!24\.[^0]) 来防止 24.0 或 24.00 以外的任何内容,但从主要模式,并在开始时包括对 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.00)。

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

为了比较,这里有一个纯 CFML 的方法:

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

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

关于regex - 带增量的小时的正则表达式 (RegEx),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21859387/

相关文章:

ColdFusion 在 robots.txt 中搜索特定页面异常

html - cfmail 标签中的表

coldfusion - Lucee/Adobe ColdFusion - 从线程设置/获取信息{}

coldfusion - 返回查询结构

php - 无法将带有修饰符/e的 preg_replace() 转换为 preg_replace_callback()

regex - 如何匹配直到最后一次出现 bash shell 中的字符

r - 解析每一行中的字符串并将结果扩展为整洁的数据框

regex - Chrome 开发者工具 - 使用过滤器文本字段匹配多个请求

javascript - 如何在 Javascript 中构建匹配 1,234.56 1.234,56 1234.56 和 1234,56 的正则表达式?

ajax - 如何从 "ColdFusion button"调用 JavaScript 函数