在正则表达式中从1到2 ^ 31 -1的正数

时间:2009-12-18 06:29:58

标签: regex validation

我得到了以下正则表达式几乎完成了工作,但不排除零......怎么做?

^(\d|\d{1,9}|1\d{1,9}|20\d{8}|213\d{7}|2146\d{6}|21473\d{5}|214747\d{4}|2147482\d{3}|21474835\d{2}|214748364[0-7])$

还有人可以解释一下这是如何工作的吗?

3 个答案:

答案 0 :(得分:10)

正则表达式是此作业的正确工具。更好的解决方案是从字符串中提取整数(您可以使用正则表达式,只需\d+),然后将其转换为整数,然后根据所需范围检查整数。

一个重要的推论是永远不要盲目地使用你自己不了解的正则表达式(或任何代码)。如果您使用上面的正则表达式,那么您会做什么,然后需要修改可接受的范围?

答案 1 :(得分:4)

正如格雷格所说,正则表达不适合这里的工作。但是,如果你坚持要知道你粘贴的正则表达式如何工作:

最重要的是要记住2**31 - 1 = 2147483647(10位数字)。本质上,正则表达式说:

  • 该号码可以有1-9位,或
  • 它后面的任何9位数都可以是1,或者
  • 20,其后有8位数,或者
  • 213,其后有7位数,或
  • ......我相信你会看到它的发展方向

它将数字限制在低于2147483647的范围内。

P.S。给定这样一个数字作为字符串s,在Python中,你可以设置这个条件:

1 <= int(s) <= 2**31 - 1

答案 2 :(得分:0)

除了其他答案之外,你的正则表达式不会工作(除了允许0):它错误地排除了2100000000,2147483639之类的数字,以及这两者之间的大部分数字。解决方案是用nnnn替换大多数nnn[0-n]前缀(以及其他修复),但真正的解决方案是不使用正则表达式。