最近发现有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;
}
}乐享:知识积累,快乐无限。