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

Boh*_*ian 5 regex validation integer

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

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

我试过了

\d{1,10}
Run Code Online (Sandbox Code Playgroud)

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


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

-2147483648
-2099999999
-999999999
-1
0
1
999999999
2099999999
2147483647
Run Code Online (Sandbox Code Playgroud)

它不应该匹配:

-2147483649
-2200000000
-11111111111
2147483648
2200000000
11111111111
Run Code Online (Sandbox Code Playgroud)

我已经设置了一个在线实时演示(在rubular上),我的尝试和上面的测试用例.


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

Psh*_*emo 5

我真的希望它只是让人感到困惑,没有人会在现实世界中使用正则表达式解决这个问题.正确的解决方案是将数字从字符串转换为数字类型BigInteger.这应该让我们检查采用适当的方法或运营商的范围,比如compareTo,>,<.


为了简化生活,您可以使用此页面(死链接)生成范围的正则表达式.所以范围的正则表达式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
Run Code Online (Sandbox Code Playgroud)

和范围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$

如果你将String#matches(regex)在每行的Java 方法中使用它,你也可以跳过^$部分,因为它们将被自动添加以确保整个字符串匹配正则表达式.

我知道这个正则表达式非常难看,但只是说明为什么正则表达式不是范围验证的好工具.