JS中如何无需手动分段编写正则验证0-9223372036854775807的正长整数?
验证0到9223372036854775807的正则表达式方案
不用手动拆分所有数字区间的话,可以通过分场景匹配+负向预查排除非法值的方式实现,既简洁又能覆盖所有有效值:
正则表达式
^(0|[1-9]\d{0,17}|(?!922337203685477580[8-9]|92233720368547758[1-9]\d|922337203685477[6-9]\d{2}|9223372036854[8-9]\d{3}|922337203685[5-9]\d{4}|92233720368[6-9]\d{5}|922337203[9]\d{6}|9223372[1-9]\d{7}|922337[3-9]\d{8}|92233[8-9]\d{9}|9223[4-9]\d{10}|922[4-9]\d{11}|92[3-9]\d{12}|9[3-9]\d{13}|[1-9]\d{18}))\d{19})$
逻辑说明
这个正则把有效值分成三类处理:
- 单独的0:直接匹配
0,避免前导零问题 - 1-18位正整数:用
[1-9]\d{0,17}匹配,确保第一位非0,总长度不超过18位 - 19位有效整数:先匹配19位数字,再通过负向预查
(?!...)排除所有大于9223372036854775807的情况:- 从左到右逐位对比目标值,只要某一位超过目标值对应位,后面不管是什么数字都直接排除
- 比如
922337203685477580[8-9]排除最后一位是8/9的19位数,92233720368547758[1-9]\d排除倒数第二位是1-9的19位数,以此类推
这种方式不用手动编写每一段允许的数字范围,而是通过反向排除非法值来实现,逻辑更清晰,也减少了手动分段的出错概率。
内容的提问来源于stack exchange,提问作者Andrea Costanzo
相关产品推荐
相关产品推荐

