我只需要接受符合这些规则的输入......
一些有效条目的示例:
一些无效条目的示例:
我知道RegEx是一种模式匹配语言,因此它对于范围,小于和大于检查并不是很好。所以要检查它是否小于或等于24意味着我必须找到一个模式,对吧?所以有24种可能的模式可以使这个很长的RegEx,我能正确理解吗?我可以使用ColdFusion进行检查以确保它在0-24范围内。如果我在这部分使用ColdFusion,那么这不是世界末日,但如果它不会导致它过长,那么将它全部放入RegEx会很好。这就是我到目前为止所做的:
^\d{0,2}((\.(0|00|25|5|50|75))?)$
除了0-24范围检查或仅检查零之外,它几乎可以处理所有这些。我会继续关注它,但任何帮助将不胜感激。谢谢!
答案 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?)?)$
答案 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))?$