我敢肯定,这个网站上实际上还没有回答。为了一劳永逸,那是一个数字字符串,它是在32位有符号整数的范围,在范围匹配的最小的正则表达式-2147483648
来2147483647
。
我必须使用正则表达式进行验证-这是我唯一可用的选项。
我努力了
\d{1,10}
但我不知道如何将其限制在有效数字范围内。
为了帮助使用正则表达式进行开发,它应匹配:
-2147483648
-2099999999
-999999999
-1
0
1
999999999
2099999999
2147483647
它不应该匹配:
-2147483649
-2200000000
-11111111111
2147483648
2200000000
11111111111
我已经建立了一个在线现场演示(在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
和范围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
。
由于Bohemian在他的评论中注意到,最终的正则表达式可以采用形式,-?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$
如果您将在JavaString#matches(regex)
方法的每一行中使用它,您也可以跳过^
和删除$
部分,因为它们将被自动添加以确保整个字符串与正则表达式匹配。
我知道这个正则表达式非常丑陋,但仅说明了为什么正则表达式不是范围验证的好工具。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句