63

我正在尝试创建一个正则表达式以使字符串仅包含0-9作为字符,并且它的长度必须至少为 1 个字符且不超过45. 所以例子将00303039是一个匹配,而039330a29不是。

到目前为止,这就是我所拥有的,但我不确定它是否正确

[0-9]{1,45} 

我也试过

^[0-9]{45}*$

但这似乎也不起作用。我对正则表达式不是很熟悉,所以任何帮助都会很棒。谢谢!

4

8 回答 8

170

您快到了,您只需要开始锚点 ( ^) 和结束锚点 ( $):

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

\d是字符类的缩写[0-9]。您可以将其用作:

^\d{1,45}$

锚点强制模式匹配整个输入,而不仅仅是其中的一部分


您的正则表达式[0-9]{1,45}会查找 1 到 45 位数字,因此字符串 like foo1也会匹配,因为它包含1.

^[0-9]{1,45}查找 1 到 45 位数字,但这些数字必须位于输入的开头。它匹配123但也123foo

[0-9]{1,45}$查找 1 到 45 位数字,但这些数字必须位于输入的末尾。它匹配123但也foo123

^[0-9]{1,45}$查找 1 到 45 位数字,但这些数字必须同时位于输入的开头和结尾,实际上它应该是整个输入。

于 2010-10-19T12:00:17.873 回答
14

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

^\d{1,45}$

哪里\d一样[0-9]

于 2010-10-19T12:00:50.563 回答
14

如果您不想从零开始,请使用此正则表达式:

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

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

^[0-9]{1,45}$
于 2013-07-11T08:14:31.990 回答
5

codaddict 提供了正确的答案。至于你尝试了什么,我会解释为什么他们没有成功:

  • [0-9]{1,45}几乎就在那里,但是它匹配一个 1 到 45 位的字符串,即使它出现在另一个包含其他字符的更长字符串中。因此,您需要^并将$其限制为完全匹配。

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

于 2010-10-19T12:03:24.090 回答
4

这两种尝试的组合可能是您需要的:

^[0-9]{1,45}$
于 2010-10-19T12:01:09.573 回答
2

Rails 出于某些安全原因不喜欢使用 ^ 和 $ ,可能最好使用 \A 和 \z 来设置字符串的开头和结尾

于 2014-04-05T13:25:36.053 回答
2

^[0-9]{1,45}$是正确的。

于 2010-10-19T12:00:55.650 回答
-1

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

\b\d{1,45}\b

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

于 2020-07-16T07:22:24.860 回答