当前位置: 首页 > news >正文

基于正则的Java的IP地址格式校验(ipv4 ipv6)


import java.util.regex.Pattern;public class IPAddressValidator {/*** IPv4正则表达式:匹配0.0.0.0到255.255.255.255*/private static final String IPV4_PATTERN ="^((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 String IPV6_PATTERN ="^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$";// 预编译正则表达式提升性能private static final Pattern IPv4_REGEX = Pattern.compile(IPV4_PATTERN);private static final Pattern IPv6_REGEX = Pattern.compile(IPV6_PATTERN);/*** 校验字符串是否为合法的IPv4或IPv6地址** @param ipAddress 待校验的IP地址字符串* @return 验证结果:* - "IPv4":符合IPv4格式* - "IPv6":符合IPv6格式* - "Invalid":不符合任何格式*/public static String validateIPAddress(String ipAddress) {if (ipAddress == null || ipAddress.isEmpty()) {return "Invalid";}// 优先检查IPv4(IPv4地址长度通常更短)if (IPv4_REGEX.matcher(ipAddress).matches()) {return "IPv4";}// 检查IPv6if (IPv6_REGEX.matcher(ipAddress).matches()) {return "IPv6";}return "Invalid";}// 测试用例public static void main(String[] args) {String[] testIPs = {"192.168.1.1",        // 有效IPv4"255.255.255.0",      // 有效IPv4"2001:0db8:85a3:0000:0000:8a2e:0370:7334",  // 有效IPv6"FE80:0000:0000:0000:0202:B3FF:FE1E:8329",  // 有效IPv6"256.0.0.1",          // 无效IP(数字超过255)"192.168.01.1",       // 无效IP(前导零不允许)"2001::0db8::7334",   // 无效IPv6(连续双冒号仅允许一次)"not.an.ip.address"    // 无效字符串};for (String ip : testIPs) {System.out.println(ip + " ➜ " + validateIPAddress(ip));}}
}

关键逻辑说明:

​IPv4验证规则​:
  • 四组十进制数字,用点分隔(如 192.168.1.1)
  • 每组数字范围:0-255
  • ​禁止前导零​(如 01.0.0.1无效)

正则分解:

  • 25[0-5]:匹配250-255
  • 2[0-4][0-9]:匹配200-249
  • [01]?[0-9][0-9]?:匹配0-199(允许单/双数字)
​IPv6验证规则​:

八组四位十六进制数,用冒号分隔(如 2001:0db8:85a3::8a2e:0370:7334)
支持字母大小写(a-f或 A-F)

​- 不支持缩写形式​(如 ::需扩展为标准格式)

  • 正则简化:([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}
以上方法, 还存在问题,例如对ipv4对前导0的校验还有问题!!!!, 但是并不代表该方法不可用!
http://www.lryc.cn/news/625654.html

相关文章:

  • PythonDay31
  • Kubernetes集群安装部署--flannel
  • 【Langchain系列七】Langchain+FastAPI(字符串输出与OpenAI规范流式输出)+FastGPT
  • openssl生成自签名证书的方法
  • 算法第五十一天:图论part02(第十一章)
  • AI驱动的SEO关键词优化秘籍
  • 【LeetCode题解】LeetCode 162. 寻找峰值
  • SQL 语句进阶实战:从基础查询到性能优化全指南
  • Docker+Nginx+Node.js实战教程:从零搭建高可用的前后端分离项目
  • 黑客哲学之学习笔记系列(六)
  • Node.js完整安装配置指南(包含国内镜像配置)
  • HTB 赛季8靶场 - CodeTwo
  • HarmonyOS 实战:学会在鸿蒙中使用第三方 JavaScript 库(附完整 Demo)
  • 土地财政历史探寻
  • 陪诊系统开发哪家强?XK+支持 API对接+私有化部署,按需定制功能模块!
  • 涡流-信号完整性分析
  • 软件开发中的 8 个伦理问题示例
  • KMM跨平台叛逃实录:SwiftUI与Compose Multiplatform共享ViewModel的混合开发框架(代码复用率85%)
  • MySQL事务篇-事务概念、并发事务问题、隔离级别
  • 微软AD国产化替换倒计时——不是选择题,而是生存题
  • 【python实用小脚本-190】Python一键删除PDF任意页:输入页码秒出干净文件——再也不用在线裁剪排队
  • 《WASM驱动本地PDF与Excel预览组件的深度实践》
  • LeetCode 100 -- Day2
  • Leetcode 3654. Minimum Sum After Divisible Sum Deletions
  • C++小游戏NO.1游戏机
  • 【GNSS定位原理及算法杂记5】​​​​PPK(后处理动态定位)深度解析:后处理的艺术与 RTK 的互补
  • 【HarmonyOS】H5 实现在浏览器中正常跳转 AppLinking 至应用
  • HarmonyOS 中的 setInterval的基本使用
  • Android Coil 3拦截器Interceptor计算单次请求耗时,Kotlin
  • 进程通信:进程池的实现