71 lines
2.0 KiB
Java
71 lines
2.0 KiB
Java
package com.sunyard.util;
|
||
|
||
import java.util.regex.Pattern;
|
||
|
||
public class AddressUtil {
|
||
// 处理带端口号的地址
|
||
public static boolean isValidAddressWithPort(String address) {
|
||
if (address == null) {
|
||
return false;
|
||
}
|
||
|
||
// 分离 IP:port 或 [IPv6]:port
|
||
String[] parts;
|
||
if (address.startsWith("[") && address.contains("]:")) {
|
||
parts = address.split("\\]:", 2);
|
||
parts[0] = parts[0] + "]"; // 补全 IPv6 的括号
|
||
} else {
|
||
parts = address.split(":", 2);
|
||
}
|
||
|
||
if (parts.length != 2) {
|
||
return false;
|
||
}
|
||
|
||
String ipPart = parts[0];
|
||
String portPart = parts[1];
|
||
|
||
return isValidIP(ipPart) &&
|
||
isValidPort(portPart);
|
||
}
|
||
|
||
// IPv4 正则(允许 0-255)
|
||
private static final Pattern IPV4_PATTERN = Pattern.compile(
|
||
"^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"
|
||
);
|
||
|
||
// IPv6 正则(包含缩写形式)
|
||
private static final Pattern IPV6_PATTERN = Pattern.compile(
|
||
"^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$"
|
||
);
|
||
|
||
// 简化域名正则(允许字母、数字、连字符和点)
|
||
private static final Pattern DOMAIN_PATTERN = Pattern.compile(
|
||
"^([a-zA-Z0-9-]{1,63}\\.)+[a-zA-Z]{2,63}$"
|
||
);
|
||
|
||
public static boolean isValidIP(String ip) {
|
||
// 检查 IPv4 或 IPv6
|
||
return IPV4_PATTERN.matcher(ip).matches() ||
|
||
IPV6_PATTERN.matcher(ip).matches();
|
||
}
|
||
|
||
public static boolean isValidDomain(String domain) {
|
||
return DOMAIN_PATTERN.matcher(domain).matches();
|
||
}
|
||
|
||
public static boolean isValidPort(int port) {
|
||
return port >= 0 && port <= 65535;
|
||
}
|
||
|
||
// 字符串形式的端口校验
|
||
public static boolean isValidPort(String portStr) {
|
||
try {
|
||
int port = Integer.parseInt(portStr);
|
||
return port >= 0 && port <= 65535;
|
||
} catch (NumberFormatException e) {
|
||
return false;
|
||
}
|
||
}
|
||
}
|