我只需要接受符合这些规则的输入......
一些有效条目的示例:
一些无效条目的示例:
我知道RegEx是一种模式匹配语言,因此它对于范围,小于和大于检查并不是很好.所以要检查它是否小于或等于24意味着我必须找到一个模式,对吧?所以有24种可能的模式可以使这个很长的RegEx,我能正确理解吗?我可以使用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])?,它会匹配从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)
现在,你真的确定它作为一个正则表达式更好......
| 归档时间: |
|
| 查看次数: |
453 次 |
| 最近记录: |