用正则校验IP地址(以及更好的方法)
正则能匹配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判断——可用 子网计算器 来理解范围。