【问题标题】:Validate if input string is a number between 0-255 using regex使用正则表达式验证输入字符串是否为 0-255 之间的数字
【发布时间】:2015-07-28 18:13:22
【问题描述】:

我在将输入字符串与正则表达式匹配时遇到问题。我想验证输入数字是否在 0-255 之间,长度最多应为 3 个字符。代码工作正常,但是当我输入 000000 到任何长度时显示的是 true 而不是 false。

这是我的代码:-

String IP = "000000000000000";
        System.out.println(IP.matches("(0*(?:[0-9][0-9]?|[0-2][0-5][0-5]))"));

【问题讨论】:

  • 为什么要使用正则表达式?
  • 如果你需要前导零,试试这个:"((\\d{1,2}|[01]\\d{1,2}|[0-2][0-4]\\d|25[0-5])\\.){3}(\\d{1,2}|[01]\\d{1,2}|[0-2][0-4]\\d|25[0-5])"
  • 为什么要执行大约 1 兆字节的正则表达式代码,而不是简单地转换为二进制然后一个比较运算符?
  • 一个人最终需要像这样定义正则表达式,因为一个人正在使用其他人关于如何实现 IP 过滤器的疯狂想法。我在看着你,Micronaut 安全!

标签: java regex


【解决方案1】:

对此进行了测试:

static String pattern = "^(([0-1]?[0-9]?[0-9]?|2[0-4][0-9]|25[0-5])\\.){3}([0-1]?[0-9]?[0-9]?|2[0-4][0-9]|25[0-5]){1}$";

它适用于以下情况:

  • IP 地址 xxx.xxx.xxx.xxx / xx.xx.xx.xx / x.x.x.x / 这些的混合。
  • 允许前导零。
  • 范围 0-255 / 最多 3 位。

【讨论】:

    【解决方案2】:

    你可以使用这个正则表达式:

    boolean valid = IP.matches("\\b(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\\b");
    

    RegEx Demo

    【讨论】:

    • 感谢阿努巴瓦。它现在工作完美。您还可以建议我更好的资源来学习基础知识之外的正则表达式。
    • 只是一点点补充:您可以通过添加 1 来缩短您的 regexp 1 标签?在你的 2 位数匹配的前面,因为 0-99/ 100 -199 只有一个可选的 1 是区别,你可以取出 1[0-9]{2} 部分
    • 我们也接受所有前导 0 怎么样:\b0*(?:1?[0-9]{1,2}|2[0-4][0-9]|25[ 0-5])\b 然后如果要验证有效的 IPv4 地址,可以使用以下命令: (?:0*(?:1?[0-9]{1,2}|2[0-4 ][0-9]|25[0-5])\.){1,3}0*(?:1?[0-9]{1,2}|2[0-4][0-9 ]|25[0-5]) ***(记住 127.1 与 127.0.0.1 相同,因此 127.1 是有效的 IP 地址)***
    • 因此,@zolo 的建议 ((1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])) 正则表达式不像 @mickmackusa 所指出的那样严格,并且允许具有前导零的两位数。 @anubhava 的替代解决方案 ([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]) 将提供更严格的正则表达式,不允许使用前导零的两位数。
    【解决方案3】:

    您可以使用与"0""1"、..."255" 匹配的模式:

    "([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"
    

    Demo on Ideone

    【讨论】:

    • 您对每种情况的提及都是正确的,但是您可以简化它。 0-199 你可以检查一个部分,200-249 另一个,250-255 是第三个。更短、更简单、更快。
    • 我在regular-expressions.info/numericranges.html 找到了这个解决方案,并有更深入的解释。此外,您可以将此正则表达式缩短为([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]),正如@anubhava 的替代解决方案所见。基本上,您将 1[0-9][0-9] 替换为 1[0-9]{2}
    【解决方案4】:

    使用边界标签确保仅匹配(0 到 255)个数字,我必须提供的优化模式是:

    \b(?:1\d{2}|2[0-4]\d|[1-9]?\d|25[0-5])\b
    

    Pattern Demo(在 PHP/PCRE 中显示步数)

    4010 步检查从0256 的列表。

    此模式将不匹配 01001。 (一个或多个前导零不匹配)

    注意事项:

    1. 对连续的重复字符使用量词。
    2. 不按顺序(个位数、两位数、100's、under-249、250-255)组织备选方案,但首先是最快的不匹配。
    3. 避免不必要的捕获(或非捕获)组。 (尽管浓缩模式的“二百”部分似乎合乎逻辑)

    【讨论】:

      【解决方案5】:

      请试试这个

      "^(((\d|0\d|00\d|\d{2}|0\d{2}|1\d{2}|2[0-4]\d|2[0-5]{2})\.){3})(\d|0\d|00\d|\d{2}|0\d{2}|1\d{2}|2[0-4]\d|2[0-5]{2})$"
      

      它也适用于前导零

      【讨论】:

        【解决方案6】:
        boolean valid = IP.matches("(0?[0-9]{1,2}|1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])");
        

        【讨论】:

          【解决方案7】:

          完成 ip inet4 匹配:

          JS

          /(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])/g.exec(myIp);
          

          https://regex101.com/r/tU3gC3/12

          缩小:

          /(1?(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])/g.exec(myIp);
          

          https://regex101.com/r/tU3gC3/13

          【讨论】:

            【解决方案8】:

            这将适用于以下模式和包含初始零的 ip 例如:023.45.12.56

            pattern=(\\d{1,2}|(0|1)\\d{2}|2[0-4]\\d|25[0-5]);
            

            【讨论】:

              【解决方案9】:

              如果你需要前导零,试试这个:

              "((\\d{1,2}|[01]\\d{1,2}|[0-2][0-4]\\d|25[0-5])\\.){3}(\\d{1,2}|[01]\\d{1,2}|[0-2][0-4]\\d|25[0-5])"
              

              满足以下条件:IP地址为“A.B.C.D”形式的字符串,其中A、B、C、D的取值范围为0~255。允许前导零。 A、B、C、D的长度不能大于3。

              也许有人可以帮助进一步简化?

              【讨论】:

                【解决方案10】:

                如果你想用 'ip/mask' 验证 ip4,那么正则表达式看起来像这样:

                ^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\/([0-9]|[1-2][0-9]|3[0-2]))$
                

                只要 ip

                ^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
                

                JS 代码来测试它

                function isMatchByRegexp(stringToValidate, regexp) {
                var re = new RegExp(regexp);
                return re.test(stringToValidate);
                }
                

                【讨论】:

                  【解决方案11】:

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

                  专门匹配0到249

                  【讨论】:

                    【解决方案12】:

                    您可以通过考虑可能发生的四种情况来简化它

                     String zeroTo255 = "((0|1)\\d{2}|2[0-4]\\d|25[0-5]|\\d{1,2})";
                     String validIpPattern = zeroTo255 + "\\." + zeroTo255 + "\\." + zeroTo255 + "\\." + zeroTo255;
                    
                    1. (0|1)\d{2} 捕获以 0 或 1 开头的任何三位数。
                    2. 2[0-4]\d 捕获 200 到 249 之间的数字。
                    3. 25[0-5] 捕获 250 到 255 之间的数字。
                    4. \d{1,2} 捕获任何一位或两位数字

                    你可以在https://regexr.com/测试它

                    要在regexr 中测试它,您需要删除一个反斜杠

                    (\\d --> \d)

                    ((0|1)\d{2}|2[0-4]\d|25[0-5]|\d{1,2})
                    

                    注意\d表示正则表达式中的数字,与[0-9]相同

                    【讨论】:

                      猜你喜欢
                      • 2011-09-27
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多