在網路應用開發中,使用者輸入的 IP 位址格式正確性直接影響連線成功率與系統安全性。錯誤的 IP 格式會導致連線失敗、例外拋出,甚至被惡意利用進行注入攻擊。本文詳細解析 IPv4 位址的正則表達式構建邏輯,提供可直接用於生產環境的 Java 驗證工具類。
標準 IPv4 位址由四段數字組成,以點號分隔,每段範圍 0-255:
[1-9] 或 0(但首位不能為 0,除非該段就是 0)[1-9]\d1\d{2}2[0-4]\d25[0-5]^
(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[1-9]) # 第一段 1-255 (首段不可為 0)
\.
(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d) # 第二段 0-255
\.
(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d) # 第三段 0-255
\.
(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d) # 第四段 0-255
$
public class IpValidator {
// 預編譯正則表達式,效能最佳化
private static final Pattern IP_PATTERN = Pattern.compile(
"^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\." +
"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\." +
"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\." +
"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$"
);
/**
* 驗證 IPv4 位址格式
* @param ip 待驗證的 IP 字串
* @return true 表示合法 IPv4 格式
*/
public static boolean isValidIpv4(String ip) {
if (ip == null || ip.isEmpty()) {
return false;
}
return IP_PATTERN.matcher(ip).matches();
}
/**
* 驗證並回傳標準化 IP(去除前導零)
*/
public static String normalizeIpv4(String ip) {
if (!isValidIpv4(ip)) {
throw new IllegalArgumentException("Invalid IPv4 format: " + ip);
}
String[] parts = ip.split("\\.");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < parts.length; i++) {
if (i > 0) sb.append('.');
sb.append(Integer.parseInt(parts[i])); // 自動去除前導零
}
return sb.toString();
}
}
import javax.swing.JOptionPane;
public class IpInputDemo {
public static void main(String[] args) {
String input = JOptionPane.showInputDialog("請輸入伺服器 IP 位址:");
if (input != null && !IpValidator.isValidIpv4(input)) {
JOptionPane.showMessageDialog(null,
"IP 位址格式錯誤!\n正確格式範例:192.168.1.1",
"輸入錯誤",
JOptionPane.ERROR_MESSAGE);
} else if (input != null) {
String normalized = IpValidator.normalizeIpv4(input);
System.out.println("標準化 IP: " + normalized);
// 繼續建立連線...
}
}
}
| 輸入 | 結果 | 說明 |
|---|---|---|
| 192.168.1.1 | ✅ 通過 | 標準私有 IP |
| 255.255.255.255 | ✅ 通過 | 廣播位址 |
| 0.0.0.0 | ❌ 失敗 | 首段不可為 0(特殊用途除外) |
| 192.168.001.1 | ✅ 通過 | 允許前導零,但建議標準化 |
| 256.1.1.1 | ❌ 失敗 | 超出 255 範圍 |
| 192.168.1 | ❌ 失敗 | 段數不足 |
| 192.168.1.1.1 | ❌ 失敗 | 段數過多 |
| abc.def.ghi.jkl | ❌ 失敗 | 非數字字元 |
現代應用建議同時支援 IPv6,可使用 JDK 內建 InetAddress 輔助驗證:
public static boolean isValidIp(String ip) {
if (ip == null || ip.isEmpty()) return false;
try {
InetAddress address = InetAddress.getByName(ip);
return address instanceof Inet4Address || address instanceof Inet6Address;
} catch (UnknownHostException e) {
return false;
}
}
正確的 IP 格式驗證是網路應用的第一道防線,結合正則表達式精確匹配與 JDK 內建工具類雙重保障,能有效攔截格式錯誤輸入,提升系統健壯度。