使用std :: regex调用abort()来验证URL

时间:2013-05-27 09:05:48

标签: c++ regex validation c++11

#include  <iostream>      
#include  <string>    
#include <regex>    
using namespace std;   

int main ()
{        

  if (std::regex_match ("http://www.google.com", std::regex("(http|https):\/\/(\w+\.)*(\w*)\/([\w\d]+\/{0,1})+")))    
    std::cout << "valid URL \n";  
  std::cout << std::endl;     
  return 0;

}

用警告编译,但是当我执行它时会给出

terminate called after throwing an instance of 'std::regex_error'

  what():  regex_error

中止(核心倾销)

我应该做什么?

2 个答案:

答案 0 :(得分:3)

您忽略的警告可能会告诉您问题所在。

通过查看模式,您没有正确地转义模式字符串。

正确转义模式字符串以使用'\'来转义反斜杠可以解决问题。否则,编译器会将未转义反斜杠后面的字符解释为字符串控制字符。

std::regex("(http|https)://(\\w+.)(\\w)/([\\w\\d]+/{0,1})+")

答案 1 :(得分:1)

尝试 cpp-netlib

#include <string>
#include <iostream>
#include <boost/network/uri.hpp>

int main (int argc, char ** argv)
{
    std::string address = "http://www.google.com";
    boost::network::uri::uri uri_(address);
    if ( !boost::network::uri::valid(uri_) )
    {
        // error
        std::cout << "not valid" << std::endl;
        return 0;
    }
    std::cout << "valid" << std::endl;

    std::string host = boost::network::uri::host(uri_); 
    std::string port = boost::network::uri::port(uri_); 
    std::string scheme = boost::network::uri::scheme(uri_);

    return 0;
}

如何构建(在我的情况下,cpp-netlib在/root/cpp-netlib-0.9.4/中):

g++ main.cpp -L/root/cpp-netlib-0.9.4/libs/network/src/ -I/root/cpp-netlib-0.9.4/ -o main -lcppnetlib-uri -lboost_system