最近发现有ipv4与ipv6混合的ip访问,造成校验不通过。发个帖记下
效率问题,自行考虑吧。
可以加个判断,通过
":"
"."
":"与"."
三种情况进行校验判断
public class CheckIp { private static String ip_formatv4 = "^((((\\d{1,2})|(1\\d{2})|(2[0-4]\\d)|(25[0-5]))\\.){3}((\\d{1,2})|(1\\d{2})|(2[0-4]\\d)|(25[0-5])))|()$"; private static String ip_formatv6 = "^([\\da-fA-F]{1,4}:){6}((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$|^::([\\da-fA-F]{1,4}:){0,4}((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$|^([\\da-fA-F]{1,4}:):([\\da-fA-F]{1,4}:){0,3}((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$|^([\\da-fA-F]{1,4}:){2}:([\\da-fA-F]{1,4}:){0,2}((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$|^([\\da-fA-F]{1,4}:){3}:([\\da-fA-F]{1,4}:){0,1}((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$|^([\\da-fA-F]{1,4}:){4}:((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$|^([\\da-fA-F]{1,4}:){7}[\\da-fA-F]{1,4}$|^:((:[\\da-fA-F]{1,4}){1,6}|:)$|^[\\da-fA-F]{1,4}:((:[\\da-fA-F]{1,4}){1,5}|:)$|^([\\da-fA-F]{1,4}:){2}((:[\\da-fA-F]{1,4}){1,4}|:)$|^([\\da-fA-F]{1,4}:){3}((:[\\da-fA-F]{1,4}){1,3}|:)$|^([\\da-fA-F]{1,4}:){4}((:[\\da-fA-F]{1,4}){1,2}|:)$|^([\\da-fA-F]{1,4}:){5}:([\\da-fA-F]{1,4})?$|^([\\da-fA-F]{1,4}:){6}:$"; private static String ip_formatv46 = "^([\\da-fA-F]{1,4}:){6}((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$|^::([\\da-fA-F]{1,4}:){0,4}((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$|^([\\da-fA-F]{1,4}:):([\\da-fA-F]{1,4}:){0,3}((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$|^([\\da-fA-F]{1,4}:){2}:([\\da-fA-F]{1,4}:){0,2}((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$|^([\\da-fA-F]{1,4}:){3}:([\\da-fA-F]{1,4}:){0,1}((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$|^([\\da-fA-F]{1,4}:){4}:((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$"; public static String IP_FORMAT = ip_formatv4+"|"+ip_formatv6+"|" +ip_formatv46; public static void main(String[] args) { String ip4 ="111.111.111.111"; String ip6 = "5e:0:0:0:0:0:5ac8:eeee"; String ip6s="::1:8:82a8:0:0:9"; String ip46="::ffff:112.65.61.36"; boolean result = patternParam(ip46,ip_formatv46); System.out.println(result); boolean result4 = patternParam(ip4,ip_formatv4); System.out.println(result4); boolean result6 = patternParam(ip6,ip_formatv6); System.out.println(result6); boolean result6s = patternParam(ip6s,ip_formatv6); System.out.println(result6s); System.out.println("分隔符-----------------------------------------"); boolean resultall4 = patternParam(ip4,IP_FORMAT); System.out.println(resultall4); boolean resultall6 = patternParam(ip6,IP_FORMAT); System.out.println(resultall6); boolean resultall46 = patternParam(ip46,IP_FORMAT); System.out.println(resultall46); boolean resultall6s = patternParam(ip6s,IP_FORMAT); System.out.println(resultall6s); System.out.println(IP_FORMAT.length()); System.out.println(IP_FORMAT); } public static boolean patternParam(String str,String format){ if (null == str || "".equals(str.trim())) { return false; } if (null == format || "".equals(format.trim())) { return false; } Pattern pattern = Pattern.compile(format); if (null != pattern) { Matcher m = pattern.matcher(str); if (null != m && m.matches()) { return true; } } return false; } }
一种优化写法
public static boolean check_ip(String ip){ if(patternParam(ip,ip_formatv4)|| patternParam(ip,ip_formatv46) ||patternParam(ip,ip_formatv6)){ return true; }else { return false; } }
乐享:知识积累,快乐无限。