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

正則表達式精確匹配 IPv4 地址:從基礎到嚴格校驗的完整模式庫

     編輯:Java 綜合教學

正則表達式精確匹配 IPv4 地址:完整模式庫

IPv4 地址校驗是表單驗證、日誌分析、防火牆規則中的高頻需求。本文提供從簡單粗略到嚴格逐段校驗的 8 種正則模式,並解析每種模式的匹配邊界與適用場景,助你按需選型。

一、模式分級速查表

級別正則模式匹配示例不匹配示例適用場景
1️⃣ 嚴格標準(推薦生產)^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)$192.168.0.1
255.255.255.255
0.0.0.0
256.0.0.1
01.2.3.4
1.2.3
配置入庫、API 參數校驗、防火牆規則
2️⃣ 帶 CIDR 掩碼^((?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))(\/(?:[0-9]|[12]\d|3[0-2]))?$192.168.1.0/24
10.0.0.1/32
192.168.1.0/33
10.0.0.1/
網段配置、路由表條目
3️⃣ 允許前導零(寬鬆)^(?:(?:0?\d?\d|1\d{2}|2[0-4]\d|25[0-5])\.){3}(?:0?\d?\d|1\d{2}|2[0-4]\d|25[0-5])$010.020.030.040256.1.1.1兼容舊數據清洗、用戶手輸容錯
4️⃣ 簡單格式檢查(快速預檢)^\d{1,3}(\.\d{1,3}){3}$999.999.999.999abc.def.ghi.jkl前端即時提示、日誌粗提取
5️⃣ 提取嵌入文本中的 IP\b(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\b日誌行中提取—grep、Logstash、ELK pipeline
6️⃣ 私有地址段識別^(?:10\.(?:\d{1,3}\.){2}\d{1,3}|172\.(?:1[6-9]|2\d|3[01])\.(?:\d{1,3}\.){1}\d{1,3}|192\.168\.(?:\d{1,3}\.){1}\d{1,3})$10.0.0.1
172.16.0.1
192.168.1.1
8.8.8.8內網流量標記、ACL 策略
7️⃣ 保留/特殊地址排除^(?!0\.)(?!127\.)(?!255\.255\.255\.255$)(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)$192.168.1.10.0.0.0
127.0.0.1
255.255.255.255
業務 IP 入庫前過濾
8️⃣ Java 代碼中預編譯 PatternPattern IPV4 = Pattern.compile("^(?:(?:25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)$");——高頻調用避免重複編譯

二、核心子模式拆解

# 0-255 任一數值段
(?:25[0-5]        # 250-255
 | 2[0-4]\d       # 200-249
 | 1\d{2}         # 100-199
 | [1-9]?\d       # 0-99 (含單位數、十位數,排除前導零)
)
  • (?: ... ) 非捕獲組,提升性能;
  • [1-9]?\d 覆蓋 0-99,但禁止 00、01 等前導零(嚴格模式);
  • \. 轉義點號,匹配字面點;
  • {3} 精確重複 3 次「數值段+點」,最後一段無點。

三、Java 完整工具類示例

public final class Ipv4Validator {
    private static final Pattern STRICT = Pattern.compile(
        "^(?:(?:25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)$"
    );
    private static final Pattern CIDR = Pattern.compile(
        "^((?:(?:25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d))(\\/(?:[0-9]|[12]\\d|3[0-2]))?$"
    );

    public static boolean isValidIpv4(String ip) {
        return ip != null && STRICT.matcher(ip).matches();
    }

    public static boolean isValidCidr(String cidr) {
        return cidr != null && CIDR.matcher(cidr).matches();
    }

    // 從文本提取所有合法 IPv4
    public static List extractIpv4(String text) {
        List list = new ArrayList<>();
        Matcher m = Pattern.compile(
            "\\b(?:(?:25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)\\b"
        ).matcher(text);
        while (m.find()) list.add(m.group());
        return list;
    }
}

四、性能與陷阱提示

  1. 預編譯 Pattern:靜態常量持有,避免每次調用 Pattern.compile 開銷;
  2. 優先簡單模式預檢:極大文本提取時,先用 \d{1,3}(?:\.\d{1,3}){3} 快速定位候選,再用嚴格模式二次驗證;
  3. 警惕災難性回溯:避免在模式中嵌套 */+ 量詞,本文模式均為線性確定性,安全;
  4. IPv6 另當別論:本文僅針對 IPv4,IPv6 需單獨模式(含縮寫、嵌入 IPv4 等複雜情況)。
「正則是字符串處理的手術刀,銳利但需精準把握邊界。把常用模式封裝成驗證庫,既避免重複造輪子,又能統一業務邊界標準。」
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved