最近发现有ipv4与ipv6混合的ip访问,造成校验不通过。发个帖记下

效率问题,自行考虑吧。

可以加个判断,通过 

  1. ":"

  2. "."

  3. ":"与"."

三种情况进行校验判断

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;
    }
}




乐享:知识积累,快乐无限。