c++使用regex报错regex_error

2023-05-16

原本写了个同时识别IPv4和IPv6地址的C++函数:

#include <iostream>
#include <regex>

bool is_valid_ip(const std::string& ip) {
  // 定义IPv4地址的正则表达式
  std::regex pattern_ipv4("^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."
                          "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."
                          "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."
                          "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$");

  // 定义IPv6地址的正则表达式
  std::regex pattern_ipv6("^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$");

  // 使用正则表达式匹配IP地址
  return std::regex_match(ip, pattern_ipv4) || std::regex_match(ip, pattern_ipv6);
}

int main() {
  std::string ip1 = "192.168.0.1";
  std::string ip2 = "2001:0db8:85a3:0000:0000:8a2e:0370:7334";

  if (is_valid_ip(ip1)) {
    std::cout << "IPv4地址合法" << std::endl;
  } else {
    std::cout << "IPv4地址不合法" << std::endl;
  }

  if (is_valid_ip(ip2)) {
    std::cout << "IPv6地址合法" << std::endl;
  } else {
    std::cout << "IPv6地址不合法" << std::endl;
  }

  return 0;
}

编译时无报错,运行时抛异常regex_error
check后发现,gcc版本4.9以上才能使用std::regex 而我们一般gcc版本是4.8.5 所以这里不采用std::regex,gcc版本升级不现实,可采取的方案有两个:
1、使用boost::regex
2、使用inet_pton判断ip

boost::regex使用demo

#include <iostream>
#include <boost/regex.hpp>

bool is_valid_ip(const std::string& ip) {
  // 定义IPv4地址的正则表达式
  boost::regex pattern_ipv4("^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."
                            "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."
                            "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."
                            "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$");

  // 定义IPv6地址的正则表达式
  boost::regex pattern_ipv6("^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$");

  // 使用正则表达式匹配IP地址
  return boost::regex_match(ip, pattern_ipv4) || boost::regex_match(ip, pattern_ipv6);
}

int main() {
  std::string ip1 = "192.168.0.1";
  std::string ip2 = "2001:0db8:85a3:0000:0000:8a2e:0370:7334";

  if (is_valid_ip(ip1)) {
    std::cout << "IPv4地址合法" << std::endl;
  } else {
    std::cout << "IPv4地址不合法" << std::endl;
  }

  if (is_valid_ip(ip2)) {
    std::cout << "IPv6地址合法" << std::endl;
  } else {
    std::cout << "IPv6地址不合法" << std::endl;
  }

  return 0;
}

inet_pton函数来尝试将IP地址解析为IPv4或IPv6地址

#include <iostream>
#include <cstring>
#include <arpa/inet.h>

bool is_valid_ip(const std::string& ip) {
  struct in_addr addr4;
  struct in6_addr addr6;

  // 尝试将IP地址解析为IPv4地址
  if (inet_pton(AF_INET, ip.c_str(), &addr4) == 1) {
    return true;
  }

  // 尝试将IP地址解析为IPv6地址
  if (inet_pton(AF_INET6, ip.c_str(), &addr6) == 1) {
    return true;
  }

  // IP地址既不是IPv4地址也不是IPv6地址
  return false;
}

int main() {
  std::string ip1 = "192.168.0.1";
  std::string ip2 = "2001:0db8:85a3:0000:0000:8a2e:0370:7334";

  if (is_valid_ip(ip1)) {
    std::cout << "IPv4地址合法" << std::endl;
  } else {
    std::cout << "IPv4地址不合法" << std::endl;
  }

  if (is_valid_ip(ip2)) {
    std::cout << "IPv6地址合法" << std::endl;
  } else {
    std::cout << "IPv6地址不合法" << std::endl;
  }

  return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++使用regex报错regex_error 的相关文章

随机推荐

  • C语言用结构体实现串口协议

    C语言用结构体实现串口协议 需求 xff1a 我们串口发送是一个字节一个字节的 xff0c 我们制定的协议如下 xff1a 一帧协议10个字节 xff0c 放于buff 10 byte0 byte1 0x5555起始 byte2 value
  • 神经网络量化与反量化( int8与float32之间的转换)+C语言实现

    神经网络量化与反量化 xff08 int8与float32之间的转换 xff09 一 背景知识二 量化与反量化结果做对比 一 背景知识 量化并不是什么新知识 xff0c 我们在对图像做预处理时就用到了量化 回想一下 xff0c 我们通常会将
  • 分割字符串split函数的正确用法(切片)

    分割字符串split函数的正确用法 xff08 切片 xff09 split函数是将字符串分割为列表 函数原型 xff1a str span class token punctuation span span class token fun
  • 修改IP,开发板上配置ip 让开发板和电脑处于同一网段

    修改IP xff0c 开发板上配置ip 让开发板和电脑处于同一网段 一 设置临时IP二 设置动态IP三 设置静态IP 一 设置临时IP 板子和电脑通过网线直连 xff0c 设置成同一网段 xff0c 但是每次重启板子后 xff0c 都需要i
  • 电路设计_阅读英文数据手册并没有想象的那么难

    说明书的正文究竟包含哪几部分 xff0c 应根据不同产品的具体情况来确定 xff08 1 xff09 Release Date 检查手册发布的日期 xff0c 是预备版还是修正版 xff1b xff08 2 xff09 General De
  • 用C语言实现卷积操作(包含单通道单卷积和多通道多卷积以及维度的转换)

    用C语言实现卷积 单通单卷积多通道多卷积维度转换 xff08 多维转一维 xff09 完整代码实现 xff1a 单通单卷积 卷积其实就是个点成相加的过程 原理图如下 xff1a 关键代码实现 xff1a span class token c
  • 基于深度学习的车牌识别项目的APP部分之图像预处理(一):C语言读取bmp图像信息

    车牌识别项目之图像预处理一 xff1a C语言读取bmp图像信息 一 什么是bmp文件二 BMP格式结构1 文件信息头2 图像描述信息块3 BMP调色板4 BMP图像数据区 像素存储 像素数据 位图像素格式 三 原理实现 xff1a 1 打
  • 基于深度学习的车牌识别项目的APP部分之图像预处理(二):C语言实现bmp的二值化处理

    基于深度学习的车牌识别项目的APP部分之图像预处理 xff08 二 xff09 xff1a C语言实现bmp的二值化处理 一 二值化概念二 代码实现三 运行结果 xff1a 1 图像是8位深度的运行结果 xff1a 2 图像是16位深度的运
  • rviz和tf树报错修改

    跟着这个博主进行多机器人仿真 xff0c 一直出错 xff0c 有点崩溃了 ROS仿真笔记之 基于gazebo的ROS多机器人仿真 gwpscut的博客 CSDN博客 TF REPEATED DATA warnings ROS Answer
  • 港科大GVINS编译与运行教程

    GVINS GVINS是香港科技大学沈劭劼团队开源的基于因子图优化的GNSS 视觉 惯导紧耦合多传感器组合导航软件 GVINS是一个基于非线性优化的系统 xff0c 它将 GNSS 原始测量与视觉和惯性信息紧密融合 xff0c 以实现实时和
  • 硬件结构——(6) 软中断

    1 中断是什么 xff1f 在计算机中 xff0c 中断是 系统用来响应硬件设备请求 的一种机制 操作系统收到 硬件的中断请求后 xff0c 会打断正在执行的进程 xff0c 然后调用内核中的 中断处理程序 来响应请求 中断是 种 异步的事
  • C++将类序列化和反序列化到共享内存

    这里用模板泛化一下 template lt typename T gt int saveToShm const T amp obj key t key 61 gen shm key int shmId 61 shmget key sizeo
  • C++使用rapidjson进行类的序列化与反序列化

    目录 序列化 amp 反序列化单个对象序列化反序列化使用示例 序列化 amp 反序列化对象列表 C 43 43 中可以使用第三方库来实现将类序列化成JSON文件 xff0c 以及读取JSON文件内容反序列化为类对象 这里使用rapidJso
  • c++用vector实现定长队列

    目录 queue实现vector实现 我们可以用queue或vector实现定长队列 xff0c 但是如果我们有遍历定长队列的需求的话 xff0c 使用queue不是一个好的选择 xff0c 因为queue本身不支持直接访问元素 queue
  • c++判断文件是否存在

    可以使用C 43 43 的文件流来判断文件是否存在 以下是一个简单的函数 xff0c 可以通过文件名判断文件是否存在 xff1a span class token macro property span class token direct
  • 相机内外参数的意义

    1 内参数 xff1a 由于相机坐标系使用的是毫米制的单位 xff0c 而图像平面使用的像素为单位 内参数的作用就是在这两个坐标系之间进行线性的变化 相机光轴中心Z轴方向与像平面交点称为投影中心 xff0c 其坐标为 xff0c 其单位为像
  • C++实现读写分离的双缓冲buffer

    目录 1 双缓冲区 读写分离2 后台线程定时更新数据3 类设计完整代码cache cppcache hmain cppmakefile 读写分离的双缓冲buffer有以下好处 xff1a 提高了并发读写的效率 xff1a 在多线程环境下 x
  • 返回引用与返回值与返回std::move(obj)

    返回引用与返回值相比 返回引用与返回值相比有以下几个好处 xff1a 减少内存开销 xff1a 返回值需要在函数内部创建一个临时对象 xff0c 然后将该对象的副本返回给调用者 这个过程需要分配内存 复制数据等操作 xff0c 会增加内存开
  • error: non-member function ‘XXX::IsValid(const T&)’ cannot have cv-qualifier

    这个错误提示表明你定义的函数 IsValid 是一个非成员函数 xff0c 并且带有 const 限定符 在 C 43 43 中 xff0c 非成员函数不能带有 const 限定符 xff0c 因为它们没有隐式的 this 指针 xff0c
  • c++使用regex报错regex_error

    原本写了个同时识别IPv4和IPv6地址的C 43 43 函数 xff1a span class token macro property span class token directive hash span span class to