关于网络上IP地址校验正则表达式的一点缺陷

本文介绍了一种使用正则表达式验证IPv4地址有效性的方法。初始尝试未能正确处理IP地址各部分间的点号分隔符,导致错误验证。通过在每个数字段后明确加入点号,修正后的正则表达式能够准确地验证标准IPv4地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 网络上常见的代码如下:


static boolean isIpAddress(String s){
        String regex = "(((2[0-4]//d)|(25[0-5]))|(1//d{2})|([1-9]//d)|(//d)).(((2[0-4]//d)|(25[0-5]))|(1//d{2})|([1-9]//d)|(//d))
.(((2[0-4]//d)|(25[0-5]))|(1//d{2})|([1-9]//d)|(//d)).(((2[0-4]//d)|(25[0-5]))|(1//d{2})|([1-9]//d)|(//d))";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(s);
        return m.matches();
    }


经过测试,发现像“1.1.112”这样不合法的IP也可以通过校验
对0~255的校验“((2[0-4]//d)|(25[0-5]))|(1//d{2})|([1-9]//d)|(
//d)”,这段代码应该没问题了,问题就出在对“.”的处理上,于是,改成如下:


static boolean isIpAddress(String s){
        String regex = "(((2[0-4]//d)|(25[0-5]))|(1//d{2})|([1-9]//d)|(//d))[.](((2[0-4]//d)|(25[0-5]))|(1//d{2})|([1-9]//d)|(//d))
[.](((2[0-4]//d)|(25[0-5]))|(1//d{2})|([1-9]//d)|(//d))[.](((2[0-4]//d)|(25[0-5]))|(1//d{2})|([1-9]//d)|(//d))";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(s);
        return m.matches();
    }


成功!!!  

麻烦确认一下,该ip正则校验是否是正确的, public static final String IP_V4_REGEX = "^\\b((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\." + "((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\." + "((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\." + "((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\b$"; public static final String IP_V6_REGEX = "^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}" + "(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))" + "|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]" + "|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})" + "|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))" + "|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:" + "((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))" + "|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:" + "((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))" + "|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}" + ":((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))" + "|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)" + "(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$"; public static boolean isValidIpv4OrIpv6(String ip) { return Pattern.matches(IP_V4_REGEX, ip) || Pattern.matches( IP_V6_REGEX, ip); }
最新发布
06-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值