c++使用regex報錯regex_error兩種解決方案
原本寫了個同時識別IPv4和IPv6地址的C++函數(shù):
#include <iostream> #include <regex> bool is_valid_ip(const std::string& ip) { // 定義IPv4地址的正則表達(dá)式 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地址的正則表達(dá)式 std::regex pattern_ipv6("^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$"); // 使用正則表達(dá)式匹配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; }
編譯時無報錯,運(yùn)行時拋異常regex_error
check后發(fā)現(xiàn),gcc版本4.9以上才能使用std::regex 而我們一般gcc版本是4.8.5 所以這里不采用std::regex,gcc版本升級不現(xiàn)實(shí),可采取的方案有兩個:
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地址的正則表達(dá)式 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地址的正則表達(dá)式 boost::regex pattern_ipv6("^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$"); // 使用正則表達(dá)式匹配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函數(shù)來嘗試將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; }
總結(jié)
到此這篇關(guān)于c++使用regex報錯regex_error兩種解決方案的文章就介紹到這了,更多相關(guān)c++ regex報錯regex_error內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談Qt中使用CEF的幾個要點(diǎn)(Windows下)
下面小編就為大家?guī)硪黄獪\談Qt中使用CEF的幾個要點(diǎn)(Windows下)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07如何使用arm-none-eabi-gcc編譯器搭建STM32的Vscode開發(fā)環(huán)境
這篇文章主要介紹了使用arm-none-eabi-gcc編譯器搭建STM32的Vscode開發(fā)環(huán)境,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07C語言容易被忽視的函數(shù)設(shè)計(jì)原則基礎(chǔ)
C語言的設(shè)計(jì)目標(biāo)是提供一種能以簡易的方式編譯、處理低級存儲器、產(chǎn)生少量的機(jī)器碼以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的編程語言.那么C語言函數(shù)設(shè)計(jì)的一般原則和技巧都是怎樣的呢,下面帶你了解2022-04-04如何在Qt中實(shí)現(xiàn)關(guān)于Json?的操作
JSON是一種輕量級數(shù)據(jù)交換格式,常用于客戶端和服務(wù)端的數(shù)據(jù)交互,不依賴于編程語言,在很多編程語言中都可以使用JSON,這篇文章主要介紹了在Qt中實(shí)現(xiàn)關(guān)于Json的操作,需要的朋友可以參考下2023-08-08