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

plicqrtu  于 2023-08-08  发布在  其他
关注(0)|答案(3)|浏览(115)

我得到了下面的正则表达式,它几乎完成了工作,但不排除零...如何做到这一点?

^(\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])$

字符串
还有谁能解释一下这是如何工作的?

svujldwt

svujldwt1#

正则表达式 * 不是 * 这项工作的正确工具。一个更好的解决方案是从字符串中提取整数(可以使用正则表达式,只需\d+),然后将其转换为整数,然后根据所需的范围检查整数。
一个重要的推论是永远不要盲目地使用您自己不理解的正则表达式(或者任何代码)。如果您使用了上面的正则表达式,然后出现了修改可接受范围的要求,您会怎么做?

xj3cbfub

xj3cbfub2#

正如Greg所说,正则表达式并不适合这里的工作。但是如果你坚持要知道你粘贴的正则表达式是如何工作的:
最重要的是要记住2**31 - 1 = 2147483647(一个10位数的数字)。本质上,正则表达式说:

  • 数字可以有1-9位,或
  • 它可以是1,后面有任意9位数字,或
  • 20后面有任意8位数字,或
  • 213后面有任意7位数字,或
  • 我相信你知道事情的发展方向

它将数字限制在2147483647以下的范围。
P.S.给定一个字符串s这样的数字,在Python中,你可以设置这个条件:

13z8s7eq

13z8s7eq3#

除了其他答案,你的regex doesn't work(除了允许0):它错误地排除了2100000000、2147483639以及这两个数字之间的大多数数字。解决方案是将大部分nnnn前缀替换为nnn[0-n](沿着其他修复),但真实的的解决方案是不使用正则表达式。

相关问题