正则表达式为有效的32位有符号整数 [英] Regex for a valid 32-bit signed integer

查看:2056
本文介绍了正则表达式为有效的32位有符号整数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm pretty sure this hasn't actually been answered yet on this site. For once and for all, what is the smallest regex that matches a numeric string that is in the range of a 32-bit signed integer, in the range -2147483648 to 2147483647.

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

I must use regex for validation - that is the only option available to me.

我试过了

\d{1,10}

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

but I can't figure out how to restrict it to the valid number range.

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

To aid developing in regex, it should match:

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

它不匹配:

-2147483649
-2200000000
-11111111111
2147483648
2200000000
11111111111

我已经设置了一个在线直播演示 (在rubular上)有我的尝试和上面的测试用例。

I have set up an on-line live demo (on rubular) that has my attempt and the test cases above.

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

Note: The shortest regex that works will be accepted. Efficiency of regex will not be considered (unless there's a tie for shortest length).

推荐答案

我真的希望它是只是益智游戏,没有人会在现实世界中使用正则表达式来解决这个问题。正确的解决方案是将数字从字符串转换为数字类型,如 BigInteger 。这应该允许我们使用适当的方法或运算符检查其范围,例如 compareTo > <

I really hope it is just puzzler and no one will use regex for this problem in real world. Proper solution would be converting number from string to numeric type like BigInteger. This should allow us to check its range using proper methods or operators, like compareTo, >, <.

为了让生活更轻松,你可以使用< a href =http://utilitymill.com/utility/Regex_For_Range =nofollow noreferrer> 此页 (死链接)生成范围的正则表达式。所以范围 0 - 2147483647 的正则表达式看起来像

To make life easier you can use this page (dead link) to generate regex for ranges. So regex for range 0 - 2147483647 can look like

\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] - [O- 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

所以我们可以将这些范围和把它写成

So we can just combine these ranges and write it as

范围0-2147483647 - 范围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

Since Bohemian noticed in his comment final regex can be in form -?regex1|-2147483648 so here is little shorter version (also changed [0-9] to \d)

^ - ?(\d {1,9} | 1 \\\ {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 (正则表达式)方法在每一行你也可以跳过 ^ $ 部分,因为他们将自动添加以确保整个字符串与正则表达式匹配。

If you will use it in Java String#matches(regex) method on each line you can also skip ^ and $ parts since they will be added automatically to make sure entire string matches regex.

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

I know this regex is very ugly, but just shows why regex is not good tool for range validation.

这篇关于正则表达式为有效的32位有符号整数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆