如何限制时间字段用户输入,校验hh:mm-hh:mm格式的合法性
时间格式校验正则解决方案
原有正则问题说明
你编写的pattern=r'[0-2][0-9]:[0-5][0-9]-[0-2][0-9]:[0-5][0-9]'存在的核心漏洞是小时匹配规则[0-2][0-9]允许第一位为2时第二位取0-9的所有值,会匹配到24-29的非法小时,同时没有设置字符串起止匹配锚点,会导致包含合法时间片段的非法字符串也被判定通过。
可用正则表达式
兼容1位/2位小时写法(允许9:30-14:30、09:30-14:30等格式)
pattern = r'^([01]?[0-9]|2[0-3]):[0-5][0-9]-([01]?[0-9]|2[0-3]):[0-5][0-9]$'
严格要求2位小时写法(仅允许09:30-14:30这类补零的2位小时格式)
pattern = r'^([01][0-9]|2[0-3]):[0-5][0-9]-([01][0-9]|2[0-3]):[0-5][0-9]$'
正则规则逐段解释
^:匹配字符串起始位置,确保输入内容开头就是时间格式$:匹配字符串结束位置,确保输入内容末尾没有多余字符,二者配合避免xxx13:30-14:30xxx这类带额外字符的内容被误判为合法([01]?[0-9]|2[0-3]):合法小时匹配规则,|代表逻辑“或”,覆盖两种合法场景:[01]?[0-9]:匹配0-19范围的小时,[01]?表示第一位可以是0、1,也可以省略,兼容1位小时的写法2[0-3]:匹配20-23范围的小时,从规则上杜绝了24及以上的非法小时值
::固定匹配小时与分钟之间的冒号分隔符[0-5][0-9]:匹配00-59范围的分钟,第一位限定为0-5,第二位为0-9,完全符合分钟的取值要求-:固定匹配起止时间之间的连接符- 后半段
([01]?[0-9]|2[0-3]):[0-5][0-9]与前半段时间规则完全一致,用于匹配结束时间的格式
内容的提问来源于stack exchange,提问作者Veeraja Veeraesh
相关产品推荐
相关产品推荐

