ipv4校验需确保四段均为0–255且无前导零,正则为^((25[0-5]|2[0-4]d|[01]?dd?).){3}(25[0-5]|2[0-4]d|[01]?dd?)$;ipv6需兼容全展开、::压缩及ipv4嵌入格式,推荐分情况校验而非单条超长正则。

直接用正则校验原始 IPv4 和 IPv6 地址,关键不是“写得短”,而是“覆盖合法边界、排除常见非法形式”。标准地址本身不带端口、协议头或域名,只校验纯地址字符串的结构有效性。
IPv4 地址格式校验要点
IPv4 是 4 段 0–255 的十进制数,用英文点分隔。必须确保每段数值合法,且不能出现前导零(如 019 或 00)——虽然部分系统容忍,但严格校验应拒绝。
- 每段匹配逻辑:用
(25[0-5]|2[0-4]d|[01]?dd?)精确覆盖 0–255 - 避免误匹配:用
(?!.$)否定以点结尾,用^和$锚定首尾 - 完整正则示例:
^((25[0-5]|2[0-4]d|[01]?dd?).){3}(25[0-5]|2[0-4]d|[01]?dd?)$ - 注意:
192.168.01.1中的01应视为非法;192.168.0.01同理
IPv6 地址格式校验难点
IPv6 共 128 位,标准写法是 8 组 1–4 位十六进制数(如 2001:db8::1),支持零压缩(::),但 :: 最多出现一次,且不能混淆 IPv4 嵌入格式(如 ::ffff:192.0.2.1)。
- 基础全展开式:
^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$ - 必须兼容压缩写法:
::1、2001:db8::、fe80::1%eth0(可选区域标识符) - 推荐使用分情况覆盖的复合正则,例如匹配含 IPv4 嵌入的混合格式:
^(([da-fA-F]{1,4}:){6}(25[0-5]|2[0-4]d|[01]?dd?).){3}(25[0-5]|2[0-4]d|[01]?dd?)$ - 更健壮的做法是先检测是否含
::,再按段数+压缩逻辑分别验证,而非强求单条超长正则
区分 IPv4 和 IPv6 的实用判断逻辑
单靠正则无法 100% 覆盖所有 RFC 合法变体(比如带区域 ID 的 IPv6),但在前端表单或配置校验中,可组合使用两个正则快速分流:
- 先用 IPv4 正则测试,匹配成功 → 判定为 IPv4
- 不匹配时,再用 IPv6 正则测试(建议用支持
::和嵌入 IPv4 的版本) - 都不匹配 → 非法地址
- 注意:不要用
.存在与否简单判断(2001:db8::192.0.2.1含点但仍是 IPv6)
带掩码的地址需单独处理
原始地址校验不包含 CIDR 掩码,但实际场景常需支持 192.168.1.0/24 或 2001:db8::/64。此时应在基础校验后追加斜线和掩码范围检查:
- IPv4/mask:
^((25[0-5]|2[0-4]d|[01]?dd?).){3}(25[0-5]|2[0-4]d|[01]?dd?)/(\d|[12]\d|3[0-2])$ - IPv6/mask:
^([da-fA-F]{1,4}:){7}[da-fA-F]{1,4}/(\d|[1-9]\d|1[0-9]{2}|2[0-9]{2}|3[0-9]{2}|4[0-9]{2}|5[0-9]{2}|6[0-4][0-9]|65[0-5])$(IPv6 掩码最大为 128) - 掩码值必须为数字,且 IPv4 ≤ 32,IPv6 ≤ 128











