用正则校验IP地址(以及更好的方法)

最后更新: 2026-05-30

正则能匹配IP的形状,但真正的校验(范围、IPv6压缩)最好交给解析器。

IPv4 正则

每个八位组必须为0–255:

^((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$

可见它有多繁琐——而 IPv6 正则(带 :: 压缩和内嵌IPv4)则糟糕得多,且容易出错。

优先用解析器

多数语言一行即可正确校验:

import ipaddress
def is_ip(s):
    try: ipaddress.ip_address(s); return True
    except ValueError: return False
ok := net.ParseIP(s) != nil
import net from "node:net";
const ok = net.isIP(s) !== 0; // 4、6 或 0

更多见 IP编程示例

正则只适合做快速的格式过滤。要判断“这是可用地址吗?它在我的允许范围内吗?”,请用解析器加CIDR判断——可用 子网计算器 来理解范围。

参考资料