我只需要接受符合这些规则的输入...
- 0.25-24
- 0.25 的增量(.00、.25、.50、.75)
- 第一个数字不是必须的。
- 希望尾随零是可选的。
一些有效条目的示例:
- 0.25
- .50
- .5
- 1
- 1.0
- 5.50
- 23.75
- 24(最大允许)
- 更新:什么都没有,null/blank,也应该被接受为有效
一些无效条目的示例:
- 0
- .0
- .00
- 0.0
- 0.00
- 24.25
- -1
我知道 RegEx 是一种模式匹配语言,因此它不适用于范围、小于和大于检查。所以要检查它是否小于或等于 24 意味着我必须找到一个模式,对吗?所以有 24 种可能的模式会使这成为一个很长的正则表达式,我理解正确吗?我可以使用 ColdFusion 进行检查以确保它在 0-24 范围内。如果我在这部分使用 ColdFusion,这不是世界末日,但如果它不会导致它太长,那么将它全部放入 RegEx 会很好。这是我目前所拥有的:
^\d{0,2}((\.(0|00|25|5|50|75))?)$
这几乎可以处理所有问题,除了 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/