【问题标题】:How can I validate the range 1-99 using a regex?如何使用正则表达式验证范围 1-99?
【发布时间】:2011-04-30 02:30:31
【问题描述】:

我需要验证一些用户输入,以确保输入的数字在 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 是一个有效值。
  • 编号?? 0 是否允许?你不能允许 01。整数不能从零开始。
  • 为什么 01 有效而 007 或 010 无效?要么接受前导零,要么不接受。

标签: java regex validation


【解决方案1】:

给你:

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

意味着您允许其中任何一个

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

【讨论】:

  • 看起来没有其他人会倒退:)
  • 只是为了加上我的两分钱,我们最初有一个基于 1-9 的模式匹配:现有模式是 \\d?[1-9]|[1-9]0 - 这在 chrome 中运行良好,但在 IE 上运行良好。这个当前的建议^(\\d?[1-9]|[1-9]0)\$ 似乎在 IT 和 chrome 上都可以使用,请竖起大拇指回答
【解决方案2】:

在我的脑海中(未验证)

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

【讨论】:

  • 我认为应该是:^(0?[1-9]|[1-9][0-9])$。否则,^ 只绑定到第一个选项,$ 绑定到第二个选项。再说一次,我并不特别了解 Java 正则表达式。
  • 因此是“未验证”。我不记得具体的那种事情了。
  • 注意:如果使用 Matcher.matches() 方法,则不需要 ^ 和 $,因为它会尝试匹配整个字符串...
【解决方案3】:
^(([0-9][1-9])|([1-9][0-9])|[1-9])$

应该有效

【讨论】:

    【解决方案4】:
    String d = "11"
    
    if (d.length() <= 2 && d.length() >=1) {
        try {
            Integer i = Integer.valueOf(d);
            return i <= 99 && i >= 0
        }
        catch (NumberFormatException e) {
            return false;
        }
    }
    

    【讨论】:

    • 我在描述中没有发现它作为要求,尽管现在我在标题中看到了它。脱离正则表达式并拥有相同的东西似乎很有趣。
    • 你的测试还是不正确的;零不应该验证。
    【解决方案5】:
    ^[0-9]{1,2}$ 
    

    应该也可以(它也会匹配 00,希望它是有效匹配)。

    【讨论】:

    • 00 不在要求的 1-99 范围内...它也将匹配被列为无效的0。
    【解决方案6】:

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

    Apache commons 有 IntegerValidator 具有以下功能:

    isInRange(value, 1, 99)
    

    此外,如果您使用的是 Spring、Struts、Wicket、Hibernate 等,您已经可以访问范围验证器。不要用正则表达式重新发明轮子。

    【讨论】:

      【解决方案7】:

      我觉得应该是……

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

      【讨论】:

      • 前导零应该是可选的。
      • 我知道这个问题应该是可选的,但这解决了我自己的问题,即小于 10 的数字前导 0 是强制性的。
      【解决方案8】:

      这个对我有用:

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

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

      【讨论】:

        【解决方案9】:

        只要做:

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

        范围将从0 设置为9,{1,2} 表示最小位数 = 1,最大位数 = 2。

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

        【讨论】:

        • 这不能正确回答问题。您的正则表达式匹配 OP 的无效值之一:0
        • 没错!谢谢你看到我的回答。我已经进行了更正,现在可以(编辑)。
        • 现在它匹配010。它不应匹配超过两位数。 (问题文本在这一点上是模棱两可的,但例子不是。)
        【解决方案10】:

        这是最简单的,我能想到的:

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

        只允许 1-99(包括 1-99)。

        【讨论】:

        • 对于小于 10 的数字,这不允许前导零。
        • @AlanMoore 问题说 允许使用前面的 0,但可选
        • 事实上,您的正则表达式将匹配一个包含前导零的数字。但是如果你添加锚点(或使用matches() 方法),它不会。并且必须锚定正则表达式,因为我们正在尝试验证字符串。
        • @AlanMoore 感谢您的有效解释。我接受必须锚定正则表达式。您的第一条评论具有误导性和仓促。
        • 对不起,我的意思是,除了现在匹配的内容之外,正则表达式还应该匹配 01、02、03 等。
        【解决方案11】:

        很晚了,但这会奏效。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-06
          • 1970-01-01
          • 2016-06-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多