2
#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

中止 (コアダンプ)

私は何をすべきですか?

4

2 に答える 2

3

無視している警告は、おそらく問題の内容を示しています。

パターンを見ると、パターン文字列を適切にエスケープしていません。

バックスラッシュをエスケープするために「\」を使用するようにパターン文字列を適切にエスケープすると、問題が解決します。それ以外の場合、コンパイラは、エスケープされていないバックスラッシュに続く文字を文字列制御文字に解釈しようとします。

std::regex("(http|https)://(\\w+.)(\\w)/([\\w\\d]+/{0,1})+")
于 2013-05-27T09:18:06.180 に答える
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     
于 2013-05-27T09:28:04.757 に答える