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上),我的尝试和上面的测试用例.
注意:将接受有效的最短正则表达式.不考虑正则表达式的效率(除非有最短长度的平局).
我真的希望它只是让人感到困惑,没有人会在现实世界中使用正则表达式解决这个问题.正确的解决方案是将数字从字符串转换为数字类型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 方法中使用它,你也可以跳过^和$部分,因为它们将被自动添加以确保整个字符串匹配正则表达式.
我知道这个正则表达式非常难看,但只是说明为什么正则表达式不是范围验证的好工具.