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语言实现简单的三子棋小游戏

    C语言实现简单的三子棋小游戏

    这篇文章主要为大家详细介绍了C语言实现简单的三子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • 基于QT实现本地音乐播放器

    基于QT实现本地音乐播放器

    这篇文章主要为大家详细介绍了如何基于QT实现简单的本地音乐播放器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • 浅谈Qt中使用CEF的几个要点(Windows下)

    浅谈Qt中使用CEF的几个要点(Windows下)

    下面小编就为大家带来一篇浅谈Qt中使用CEF的几个要点(Windows下)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • 如何使用arm-none-eabi-gcc编译器搭建STM32的Vscode开发环境

    如何使用arm-none-eabi-gcc编译器搭建STM32的Vscode开发环境

    这篇文章主要介绍了使用arm-none-eabi-gcc编译器搭建STM32的Vscode开发环境,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • C语言杨氏矩阵查找算法实例讲解

    C语言杨氏矩阵查找算法实例讲解

    杨氏矩阵是一个数字矩阵,矩阵的每一行从左到右一次递增,矩阵从上到下递增,在这样的矩阵中查找一个数字是否存在。时间复杂度小于O(N),有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-09-09
  • C语言容易被忽视的函数设计原则基础

    C语言容易被忽视的函数设计原则基础

    C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言.那么C语言函数设计的一般原则和技巧都是怎样的呢,下面带你了解
    2022-04-04
  • 最大对称字符串的算法

    最大对称字符串的算法

    题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。
    2013-03-03
  • C++虚继承原理与类布局深度分析

    C++虚继承原理与类布局深度分析

    这篇文章主要介绍了C++虚继承原理与类布局分析,本文的目标是探究虚继承的实现方式和类布局(Class Layout)的具体规则,需要的朋友可以参考下
    2024-04-04
  • 用C语言实现二分查找算法

    用C语言实现二分查找算法

    大家好,本篇文章主要讲的是c语言实现二分查找法,感性的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • 如何在Qt中实现关于Json 的操作

    如何在Qt中实现关于Json 的操作

    JSON是一种轻量级数据交换格式,常用于客户端和服务端的数据交互,不依赖于编程语言,在很多编程语言中都可以使用JSON,这篇文章主要介绍了在Qt中实现关于Json的操作,需要的朋友可以参考下
    2023-08-08

最新评论