正则表达式允许字符串仅包含数字0-9,并将长度限制为45。

65

我正在尝试创建一个正则表达式,使得一个字符串只包含0-9作为字符,并且长度至少为1个字符但不超过45个字符。例如:00303039是匹配的,而039330a29不是。

目前这是我所拥有的,但我不确定它是否正确。

[0-9]{1,45} 

我也尝试过

^[0-9]{45}*$

但是似乎也不起作用。我对正则表达式不是很熟悉,所以希望能得到帮助。谢谢!

8个回答

176

你已经接近成功了,你所需要的是开头锚点(^)和结尾锚点($):

^[0-9]{1,45}$

\d 是字符类 [0-9] 的缩写。你可以这样使用:

^\d{1,45}$
锚点强制模式匹配整个输入,而不仅仅是其中的一部分。
你的正则表达式[0-9]{1,45}查找1到45位数字,因此像foo1这样的字符串也会被匹配,因为它包含了1^[0-9]{1,45}查找1到45位数字,但这些数字必须在输入的开头。它匹配123,但也匹配123foo[0-9]{1,45}$查找1到45位数字,但这些数字必须在输入的结尾。它匹配123,但也匹配foo123^[0-9]{1,45}$查找1到45位数字,但这些数字必须同时位于输入的开头和结尾,实际上应该匹配整个输入。

谢谢,你能解释一下这个表达式中的脱字符^和$是做什么用的吗?它们只是字符串的开头和结尾吗? - NewToRegEx
@NewToRegEx - 是的。在1-45个数字匹配之前或之后,它们不允许出现任何其他字符。 - eumiro
4
如果您生活在一个Unicode的世界里(大多数人都是),\d[0-9]不同\d允许匹配等(还有成千上万个); [0-9]则不行。 - Marc Gravell

14

第一个匹配您的字符串中任意数量的数字(也允许其他字符,例如:“039330a29”)。第二个只允许45个数字(不少于45位)。因此,从两者中选择更好的即可:

^\d{1,45}$

\d[0-9]的含义相同。


1
如果你生活在一个Unicode的世界中(大多数人都是),\d[0-9]不同的。\d允许匹配等(以及成千上万个其他字符); [0-9]则不行。 - Marc Gravell

14

如果您不想以零开头,可以使用此正则表达式:

^[1-9]([0-9]{1,45}$)

如果您不介意从零开始,可以使用:

^[0-9]{1,45}$

有助于剔除0!的能力。 - Adam Moisa

5
一种尝试结合两种方法可能是您需要的:
^[0-9]{1,45}$

5

codaddict提供了正确的答案。至于你尝试过的方法,我会解释为什么它们不行:

  • [0-9]{1,45} 差不多可以,但是它匹配一个1到45位数字字符串,即使它出现在包含其他字符的更长字符串中。因此,你需要使用^$来限制它的精确匹配。

  • ^[0-9]{45}*$ 匹配一个正好有45位数字的字符串,重复0次或任意次数 (*)。这意味着字符串的长度只能为0或者是45的倍数 (90, 135, 180...)。


2

Rails不喜欢使用^和$来设置字符串的开头和结尾,因为这会存在一些安全隐患,最好使用\A和\z来代替。


2

^[0-9]{1,45}$ is correct.


-1

对于这种情况,可以使用单词边界(\b)代替起始锚点(^)和结束锚点($):

\b\d{1,45}\b

\b 是一个位置,位于 \w 和 \W(非单词字符)之间,或者位于字符串的开头或结尾。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接