我得到了下面的正则表达式,它几乎完成了工作,但不排除零...如何做到这一点?
^(\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])$
字符串还有谁能解释一下这是如何工作的?
svujldwt1#
正则表达式 * 不是 * 这项工作的正确工具。一个更好的解决方案是从字符串中提取整数(可以使用正则表达式,只需\d+),然后将其转换为整数,然后根据所需的范围检查整数。一个重要的推论是永远不要盲目地使用您自己不理解的正则表达式(或者任何代码)。如果您使用了上面的正则表达式,然后出现了修改可接受范围的要求,您会怎么做?
\d+
xj3cbfub2#
正如Greg所说,正则表达式并不适合这里的工作。但是如果你坚持要知道你粘贴的正则表达式是如何工作的:最重要的是要记住2**31 - 1 = 2147483647(一个10位数的数字)。本质上,正则表达式说:
2**31 - 1 = 2147483647
它将数字限制在2147483647以下的范围。P.S.给定一个字符串s这样的数字,在Python中,你可以设置这个条件:
s
13z8s7eq3#
除了其他答案,你的regex doesn't work(除了允许0):它错误地排除了2100000000、2147483639以及这两个数字之间的大多数数字。解决方案是将大部分nnnn前缀替换为nnn[0-n](沿着其他修复),但真实的的解决方案是不使用正则表达式。
nnnn
nnn[0-n]
3条答案
按热度按时间svujldwt1#
正则表达式 * 不是 * 这项工作的正确工具。一个更好的解决方案是从字符串中提取整数(可以使用正则表达式,只需
\d+
),然后将其转换为整数,然后根据所需的范围检查整数。一个重要的推论是永远不要盲目地使用您自己不理解的正则表达式(或者任何代码)。如果您使用了上面的正则表达式,然后出现了修改可接受范围的要求,您会怎么做?
xj3cbfub2#
正如Greg所说,正则表达式并不适合这里的工作。但是如果你坚持要知道你粘贴的正则表达式是如何工作的:
最重要的是要记住
2**31 - 1 = 2147483647
(一个10位数的数字)。本质上,正则表达式说:它将数字限制在2147483647以下的范围。
P.S.给定一个字符串
s
这样的数字,在Python中,你可以设置这个条件:13z8s7eq3#
除了其他答案,你的regex doesn't work(除了允许0):它错误地排除了2100000000、2147483639以及这两个数字之间的大多数数字。解决方案是将大部分
nnnn
前缀替换为nnn[0-n]
(沿着其他修复),但真实的的解决方案是不使用正则表达式。