优先用手工解析或inet_pton:手工解析需校验4段、无前导零、单点分隔;inet_pton更可靠,返回1成功/0失败/-1地址族不支持,避免正则灾难性回溯与实现差异。

用 std::regex 判断 IPv4 地址是否合法,但别直接信网上抄的正则
标准库 std::regex 能做,但 C++11 的 regex 实现质量参差不齐(比如 libstdc++ 早期版本对重复量词回溯处理极慢),一个看似合理的 "^((25[0-5]|2[0-4]\d|1?\d?\d)\.){3}(25[0-5]|2[0-4]\d|1?\d?\d)$" 在某些输入下会触发灾难性回溯,比如传入 "192.168.0.256." 或超长乱码时卡住几秒甚至更久。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 优先用手工解析:按
'.'分割 + 每段转整数 + 校验范围与前导零,不到 20 行代码,稳定且快 - 若坚持用正则,务必加超时保护(C++20 不支持 regex timeout,得自己封装线程+中断逻辑,得不偿失)
- 注意
std::regex默认是 ECMAScript 语法,\d匹配 Unicode 数字,不是仅 ASCII;要严格限制,写成[0-9]
为什么 inet_pton(AF_INET, ...) 是更靠谱的选择
它不走字符串匹配逻辑,而是调用系统底层 IP 解析器,天然规避正则陷阱,还自动处理空格、多余点、大小写等边界情况。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 传入字符串必须以