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.040 | 256.1.1.1 | 兼容舊數據清洗、用戶手輸容錯 |
| 4️⃣ 簡單格式檢查(快速預檢) | ^\d{1,3}(\.\d{1,3}){3}$ | 999.999.999.999 | abc.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.1 | 0.0.0.0 127.0.0.1 255.255.255.255 | 業務 IP 入庫前過濾 |
| 8️⃣ Java 代碼中預編譯 Pattern | Pattern 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 次「數值段+點」,最後一段無點。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;
}
}
Pattern.compile 開銷;\d{1,3}(?:\.\d{1,3}){3} 快速定位候選,再用嚴格模式二次驗證;*/+ 量詞,本文模式均為線性確定性,安全;「正則是字符串處理的手術刀,銳利但需精準把握邊界。把常用模式封裝成驗證庫,既避免重複造輪子,又能統一業務邊界標準。」