IP地址格式解析工具,支持以下格式的IP地址

//IP地址格式解析工具,支持以下格式的IP地址

public class IpFormat {


public static List<String> ipFormat(String ipAddress) {
List<String> retList = new ArrayList<>();
if (ipAddress != null && !ipAddress.equals("")) {
String[] ipSplit = ipAddress.split(",");
for (String ip : ipSplit) {
String ipTrim = ip.trim();
if (ipTrim.indexOf("-") != -1) {
String[] ipRange = ipTrim.split("-");
if (ipRange.length == 2) {
String ipStart = ipRange[0].trim();
String ipEnd = ipRange[1].trim();
if (isIpAddress(ipStart)) {
if (isIpAddress(ipEnd)) {
buildIpRange(retList, ipStart, ipEnd);
} else {
if (isNumeric(ipEnd)) {
if (ipEnd.length() <= 3 && Integer.valueOf(ipEnd) >= 0 && Integer.valueOf(ipEnd) <= 255) {
ipEnd = ipStart.substring(0, ipStart.lastIndexOf(".")) + "." + ipEnd;
buildIpRange(retList, ipStart, ipEnd);
}
}
}
}
}
} else {
if (isIpAddress(ipTrim)) {
retList.add(ipTrim);
}
}
}
}
return retList;
}


private static boolean isIpAddress(String ipAddress) {
String 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";
Pattern pattern = Pattern.compile(regEx);
Matcher m = pattern.matcher(ipAddress);
return m.matches();
}


private static boolean isNumeric(String str) {
Pattern pattern = Pattern.compile("[0-9]*");
return pattern.matcher(str).matches();
}


private static long ip2long(String ipaddress) {
long[] ip = new long[4];
int position1 = ipaddress.indexOf(".");
int position2 = ipaddress.indexOf(".", position1 + 1);
int position3 = ipaddress.indexOf(".", position2 + 1);
ip[0] = Long.parseLong(ipaddress.substring(0, position1));
ip[1] = Long.parseLong(ipaddress.substring(position1 + 1, position2));
ip[2] = Long.parseLong(ipaddress.substring(position2 + 1, position3));
ip[3] = Long.parseLong(ipaddress.substring(position3 + 1));
long returnDate = (ip[0] << 24) + (ip[1] << 16) + (ip[2] << 8) + ip[3];
return returnDate;
}


private static String long2ip(long ipaddress) {
StringBuffer sb = new StringBuffer("");
sb.append(String.valueOf((ipaddress >>> 24)));
sb.append(".");
sb.append(String.valueOf((ipaddress & 0x00FFFFFF) >>> 16));
sb.append(".");
sb.append(String.valueOf((ipaddress & 0x0000FFFF) >>> 8));
sb.append(".");
sb.append(String.valueOf((ipaddress & 0x000000FF)));
return sb.toString();
}


private static void buildIpRange(List<String> retList, String ipStart, String ipEnd) {
long ipStartNum = ip2long(ipStart);
long ipEndNum = ip2long(ipEnd);
if (ipEndNum > ipStartNum) {
for (long i = ipStartNum; i <= ipEndNum; i++) {
retList.add(long2ip(i));
}
} else {
for (long i = ipStartNum; i >= ipEndNum; i--) {
retList.add(long2ip(i));
}
}
}


public static void main(String[] args) throws Exception {


// 以下是正确的格式
String ip1 = "1.2.3.4";
String ip2 = "1.2.3.4,192.168.77.66,10.0.0.5";
String ip3 = "1.2.3.0-255";
String ip4 = "1.2.3.0-1.2.3.255";
String ip5 = "1.2.3.255-0";
String ip6 = "1.2.3.255-1.2.3.0";


// 以下是错误的格式
String ip7 = "256.2.3.4";
String ip8 = "192.168.5.5-";
String ip9 = "-192.168.5.5";
String ip10 = "192.168.5.5-256";
String ip11 = "192.168.5.5-192.168.5.256";
String ip12 = "192.168.5.256-5";
String ip13 = "192.168.5.256-192.168.5.5";
String ip14 = "-";
String ip15 = ",";


System.out.println("以下是正确的格式");
System.out.println("ip1:" + ipFormat(ip1).size());
System.out.println("ip2:" + ipFormat(ip2).size());
System.out.println("ip3:" + ipFormat(ip3).size());
System.out.println("ip4:" + ipFormat(ip4).size());
System.out.println("ip5:" + ipFormat(ip5).size());
System.out.println("ip6:" + ipFormat(ip6).size());
System.out.println("ip1-6组合:" + ipFormat(ip1 + "," + ip2 + "," + ip3 + "," + ip4 + "," + ip5 + "," + ip6).size());


System.out.println("以下是错误的格式");
System.out.println("ip7:" + ipFormat(ip7).size());
System.out.println("ip8:" + ipFormat(ip8).size());
System.out.println("ip9:" + ipFormat(ip9).size());
System.out.println("ip10:" + ipFormat(ip10).size());
System.out.println("ip11:" + ipFormat(ip11).size());
System.out.println("ip12:" + ipFormat(ip12).size());
System.out.println("ip13:" + ipFormat(ip13).size());
System.out.println("ip14:" + ipFormat(ip14).size());
System.out.println("ip15:" + ipFormat(ip15).size());
System.out.println("ip7-15组合:" + ipFormat(ip7 + "," + ip8 + "," + ip9 + "," + ip10 + "," + ip11 + "," + ip12 + "," + ip13 + "," + ip14 + "," + ip15).size());
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值