首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java IP 位址合法性驗證:正則表達式完整實作指南

     編輯:Java 相關知識

前言:為什麼需要 IP 格式驗證?

在網路應用開發中,使用者輸入的 IP 位址格式正確性直接影響連線成功率與系統安全性。錯誤的 IP 格式會導致連線失敗、例外拋出,甚至被惡意利用進行注入攻擊。本文詳細解析 IPv4 位址的正則表達式構建邏輯,提供可直接用於生產環境的 Java 驗證工具類。

IPv4 位址規則分析

標準 IPv4 位址由四段數字組成,以點號分隔,每段範圍 0-255:

  • 0-9:單位數 [1-9] 或 0(但首位不能為 0,除非該段就是 0)
  • 10-99:[1-9]\d
  • 100-199:1\d{2}
  • 200-249:2[0-4]\d
  • 250-255:25[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
$

Java 實作工具類

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 的完整驗證

現代應用建議同時支援 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;
    }
}

效能優化建議

  1. 預編譯 Pattern:避免重複編譯正則,靜態常量持有
  2. 快速失敗檢查:先檢查長度範圍(7-15 字元)與點號數量(必須為 3 個)
  3. 緩存熱門 IP:對頻繁驗證的 IP 使用 LRU 快取

正確的 IP 格式驗證是網路應用的第一道防線,結合正則表達式精確匹配與 JDK 內建工具類雙重保障,能有效攔截格式錯誤輸入,提升系統健壯度。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved