正则表达式为有效的32位有符号整数

时间:2013-12-27 01:38:35

标签: regex validation integer

我很确定这个网站上还没有真正回答过。对于一劳永逸,最小的正则表达式匹配32位有符号整数范围内的数字字符串,范围为-21474836482147483647

必须使用正则表达式进行验证 - 这是我唯一可用的选项。

我试过了

\d{1,10}

但我无法弄清楚如何将其限制在有效的数字范围内。


为了帮助开发正则表达式,它应匹配:

-2147483648
-2099999999
-999999999
-1
0
1
999999999
2099999999
2147483647

不应该匹配:

-2147483649
-2200000000
-11111111111
2147483648
2200000000
11111111111

我已经设置了一个在线live demo(在rubular上),我的尝试和上面的测试用例。


注意:将接受有效的最短正则表达式。不考虑正则表达式的效率(除非有最短长度的平局)。

4 个答案:

答案 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)

修改

这是你能得到的最短的正则表达式,也是最好的方法:

我们检查从左边开始的每一个数字,如果它达到了它的极限并且之前完成了所有数字,我们将控制权放在下一个数字上。

对于范围(-21474836472147483647),它可能是- 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]$)

不应该使用正则表达式进行此类工作。