如何使用正则表达式验证1-99范围?

23

我需要验证一些用户输入,以确保输入的数字在1-99(含)的范围内。这些必须是整数值。

可以使用前导0,但是可选的。

有效的值

  1. 1
  2. 01
  3. 10
  4. 99
  5. 09

无效的值

  1. 0
  2. 007
  3. 100
  4. 10.5
  5. 010

到目前为止,我已经有了以下正则表达式:^0?([1-9][0-9])$

这允许在开头使用可选的0,但不是100%正确的,因为1被视为无效的。有改进/建议吗?


您的正则表达式也会将110视为有效值。 - Jon Skeet
数字可以是0吗?不可以允许01。整数不能以零开头。 - Serkan Hekimoglu
为什么01是有效的,而007或010则无效?要么接受前导零,要么不接受。 - nico
11个回答

36

仅凭直觉(未验证)

^(0?[1-9]|[1-9][0-9])$


我认为应该是:^(0?[1-9]|[1-9][0-9])$。否则,^仅绑定到第一个选择,$绑定到第二个选择。但是,我不特别了解Java正则表达式。 - Jander
因此出现了“未验证”。我无法具体记住那种事情。 - developmentalinsanity
请注意:如果使用Matcher.matches()方法匹配整个字符串,则不需要使用^和$。此内容与编程有关。 - user85421

15

这里是你需要的答案:

^(\d?[1-9]|[1-9]0)$

这意味着您可以允许以下任一选项:

  1. 数字1到9或01到09、11到19、21到29、......、91到99
  2. 10、20、......、90

2
似乎没有其他人会反向思考 :) - Alin Purcaru
只是想补充一下,我们最初使用了基于1-9的模式匹配:现有的模式是 \\d?[1-9]|[1-9]0 - 这在Chrome上运行良好,但在IE上不行。这个当前的建议 ^(\\d?[1-9]|[1-9]0)\$ 看起来在IT和Chrome上都能工作,已经得到了回答的认可。 - V H

5
^(([0-9][1-9])|([1-9][0-9])|[1-9])$

应该可以工作


5

为什么需要正则表达式?它不适用于数字范围计算。

Apache Commons提供了IntegerValidator,其中包括以下内容:

isInRange(value, 1, 99)

此外,如果您正在使用Spring,Struts,Wicket,Hibernate等技术,您已经可以使用范围验证器。不要重复造轮子,使用正则表达式。

2

虽然有点晚,但这个方法还是可以的。

^[1-9][0-9]?$

1

我认为应该是这样的...

^(0[1-9]|[1-9][0-9])$

前导零应该是可选的。 - Alan Moore
我知道这个问题应该是可选的,但是这解决了我自己的问题,在小于10的数字中前导0是必需的。 - Ronald91

0

这个对我自己有效:

([1-9][0-9])|(0?[1-9])

它检查10-99或1-9 => 1-99,允许一个前导零


-1
这是我能想到的最简单的正则表达式: ^([1-9][0-9]?)$ 只允许输入1-99之间的数字,包括1和99。

这不允许在小于10的数字前面加上零。 - Alan Moore
问题说“可以有前导0,但不是必需的”。 - abhisheknirmal
你的正则表达式将匹配包含前导零的数字。但是,如果添加锚点(或使用matches()方法),它将不会匹配。而且,由于我们正在尝试验证字符串,所以正则表达式必须被锚定。 - Alan Moore
@AlanMoore 感谢您提供的详细解释。我认可正则表达式必须锚定。您的第一条评论有误导性和草率之嫌。 - abhisheknirmal
抱歉,我的意思是正则表达式还应该匹配010203等,除了它现在已经匹配的内容。 - Alan Moore

-1

只需这样做:

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

范围将从09设置,{1,2}表示最小数字= 1,最大数字= 2。

例如,它将接受:0、00、01、11、45、99等... 例如,它将不接受:000、1.2、5,4、3490等...


1
这个回答并没有正确地回答问题。你的正则表达式匹配了 OP 的一个无效值:0 - Slyvain
没错!感谢您查看我的答案。我进行了更正,现在已经没问题了(编辑)。 - Marcio Zabeu
1
现在它匹配 010 。它不应该匹配超过两个数字。(问题文本在这一点上存在歧义,但示例没有。) - Alan Moore

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

也应该能工作(它也会匹配00,希望这是一个有效的匹配)。


1
“00”不在所需的1-99范围内,它也将匹配“0”,而“0”被列为无效。 - user85421

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