我很确定这个网站上还没有真正回答过。对于一劳永逸,最小的正则表达式匹配32位有符号整数范围内的数字字符串,范围为-2147483648
到2147483647
。
我必须使用正则表达式进行验证 - 这是我唯一可用的选项。
我试过了
\d{1,10}
但我无法弄清楚如何将其限制在有效的数字范围内。
为了帮助开发正则表达式,它应匹配:
-2147483648
-2099999999
-999999999
-1
0
1
999999999
2099999999
2147483647
不应该匹配:
-2147483649
-2200000000
-11111111111
2147483648
2200000000
11111111111
我已经设置了一个在线live demo(在rubular上),我的尝试和上面的测试用例。
注意:将接受有效的最短正则表达式。不考虑正则表达式的效率(除非有最短长度的平局)。
答案 0 :(得分:5)
我真的希望它只是让人感到困惑,没有人会在现实世界中使用正则表达式解决这个问题。正确的解决方案是将数字从字符串转换为数字类型,如BigInteger
。这应该允许我们使用适当的方法或运算符检查其范围,例如compareTo
,>
,<
。
为了让生活更轻松,您可以使用this page(死链接)为范围生成正则表达式。因此范围0
- 2147483647
的正则表达式看起来像
\b([0-9]{1,9}|1[0-9]{9}|2(0[0-9]{8}|1([0-3][0-9]{7}|4([0-6][0-9]{6}|7([0-3][0-9]{5}|4([0-7][0-9]{4}|8([0-2][0-9]{3}|3([0-5][0-9]{2}|6([0-3][0-9]|4[0-7])))))))))\b
(更友好的方式)
\b(
[0-9]{1,9}|
1[0-9]{9}|
2(0[0-9]{8}|
1([0-3][0-9]{7}|
4([0-6][0-9]{6}|
7([0-3][0-9]{5}|
4([0-7][0-9]{4}|
8([0-2][0-9]{3}|
3([0-5][0-9]{2}|
6([0-3][0-9]|
4[0-7]
)))))))))\b
和范围0
- 2147483648
\b([0-9]{1,9}|1[0-9]{9}|2(0[0-9]{8}|1([0-3][0-9]{7}|4([0-6][0-9]{6}|7([0-3][0-9]{5}|4([0-7][0-9]{4}|8([0-2][0-9]{3}|3([0-5][0-9]{2}|6([0-3][0-9]|4[0-8])))))))))\b
因此我们可以将这些范围组合起来并将其写为
range of 0-2147483647
OR
"-" range of 0-2147483648
将给我们
\b([0-9]{1,9}|1[0-9]{9}|2(0[0-9]{8}|1([0-3][0-9]{7}|4([0-6][0-9]{6}|7([0-3][0-9]{5}|4([0-7][0-9]{4}|8([0-2][0-9]{3}|3([0-5][0-9]{2}|6([0-3][0-9]|4[0-7])))))))))\b|-\b([0-9]{1,9}|1[0-9]{9}|2(0[0-9]{8}|1([0-3][0-9]{7}|4([0-6][0-9]{6}|7([0-3][0-9]{5}|4([0-7][0-9]{4}|8([0-2][0-9]{3}|3([0-5][0-9]{2}|6([0-3][0-9]|4[0-8])))))))))\b
。
由于波西米亚人在评论中注意到最终的正则表达式可以采用-?regex1|-2147483648
形式,所以这里的版本更短([0-9]
更改为\d
)
^-?(\d{1,9}|1\d{9}|2(0\d{8}|1([0-3]\d{7}|4([0-6]\d{6}|7([0-3]\d{5}|4([0-7]\d{4}|8([0-2]\d{3}|3([0-5]\d{2}|6([0-3]\d|4[0-7])))))))))$|^-2147483648$
如果您将在每行的Java String#matches(regex)
方法中使用它,您还可以跳过^
和$
部分,因为它们会自动添加以确保整个字符串与正则表达式匹配。< / p>
我知道这个正则表达式非常难看,但只是说明为什么正则表达式不是范围验证的好工具。
答案 1 :(得分:1)
修改强>
这是你能得到的最短的正则表达式,也是最好的方法:
我们检查从左边开始的每一个数字,如果它达到了它的极限并且之前完成了所有数字,我们将控制权放在下一个数字上。
对于范围(-2147483647
到2147483647
),它可能是-
signe。对于-2147483648,它必须是-
signe。
最后我们得到了这个:
^-?([0-9]{1,9}|[0-1][0-9]{9}|20[0-9]{8}|21[0-3][0-9]{7}|214[0-6][0-9]{6}|2147[0-3][0-9]{5}|21474[0-7][0-9]{4}|214748[0-2][0-9]{3}|2147483[0-5][0-9]{2}|21474836[0-3][0-9]|214748364[0-7])$|^(-2147483648)$
这是一个Live Demo
答案 2 :(得分:0)
^(429496729[0-6]|42949672[0-8]\d|4294967[01]\d{2}|429496[0-6]\d{3}|42949[0-5]\d{4}|4294[0-8]\d{5}|429[0-3]\d{6}|42[0-8]\d{7}|4[01]\d{8}|[1-3]\d{9}|[1-9]\d{8}|[1-9]\d{7}|[1-9]\d{6}|[1-9]\d{5}|[1-9]\d{4}|[1-9]\d{3}|[1-9]\d{2}|[1-9]\d|\d)$
请试试这个我随机测试不彻底。
答案 3 :(得分:0)
仅适用于零以上的数字。添加' - '并调整负数的最后一个数字模式。
(^\d{1,9}$|^1\d{9}$|^20\d{8}$|^21[0-3]\d{7}$|^214[0-6]\d{6}$|^2147[0-3]\d{5}$|^21474[0-7]\d{4}$|^214748[0-2]\d{3}$|^2147483[0-5]\d{2}$|^21474836[0-3]\d$|^214748364[0-7]$)
不应该使用正则表达式进行此类工作。