c++使用regex报错regex_error两种解决方案

 更新时间:2024年03月16日 09:23:07   作者:拾牙慧者  
C++正则表达式是一个非常强大和实用的工具,但是使用它们时需要注意仔细检查代码是否符合语法规则,这篇文章主要给大家介绍了关于c++使用regex报错regex_error的两种解决方案,需要的朋友可以参考下

原本写了个同时识别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;
}

总结 

到此这篇关于c++使用regex报错regex_error两种解决方案的文章就介绍到这了,更多相关c++ regex报错regex_error内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ Boost MultiIndex使用详细介绍

    C++ Boost MultiIndex使用详细介绍

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • OpenCV实战之基于Hu矩实现轮廓匹配

    OpenCV实战之基于Hu矩实现轮廓匹配

    这篇文章主要介绍了利用C++ OpenCV实现基于Hu矩的轮廓匹配,文中的示例代码讲解详细,对我们学习OpenCV有一定的帮助,感兴趣的可以学习一下
    2022-01-01
  • 函数外初始化与函数内初始化详细解析

    函数外初始化与函数内初始化详细解析

    函数内初始化:bool FillStr(char *&szDst, int nSize);第一个参数中的&一定不能少,这是因为在函数外部我们只声明了这个指针,具体这个指针指向内存中的哪个地址我们并不知道,所以&是为了说明传递的是这个指针的引用,那么在函数内初始化后这个指针的地址也就是外面指针的地址了
    2013-09-09
  • c语言实现php的trim标签

    c语言实现php的trim标签

    本文给大家介绍的是使用C语言实现php的trim标签功能的代码,非常的实用,其主要作用是清除字符串开头结尾除空白,有需要的小伙伴可以参考下。
    2016-01-01
  • 详解C++编程中类的成员变量和成员函数的相关知识

    详解C++编程中类的成员变量和成员函数的相关知识

    这篇文章主要介绍了C++编程中类的成员变量和成员函数的相关知识,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C++学习之命名空间详解

    C++学习之命名空间详解

    C++中,命名空间(namespace)是一个重要的概念。命名空间可以为函数、变量、类等定义作用域,避免与其他定义的名称发生冲突。下面我们就来了解一下如何使用C++命名空间,以及一些常见的操作吧
    2023-04-04
  • C语言中的rand()和rand_r()详解

    C语言中的rand()和rand_r()详解

    这篇文章主要为大家介绍了C语言中的rand()和rand_r(),具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • C++关键字typename的深入理解

    C++关键字typename的深入理解

    本篇文章是对C++中的关键字typename进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 深入理解C++的多态性

    深入理解C++的多态性

    本篇文章是对C++的多态性进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 黑客帝国数字雨效果VC6源代码分享

    黑客帝国数字雨效果VC6源代码分享

    这篇文章主要介绍了黑客帝国数字雨效果VC6源代码分享,本文直接给出实现代码,Win7下编译通过,效果很酷,需要的朋友可以参考下
    2015-02-02

最新评论