terminate called after throwing an instance of 'std::regex_error'(C++11)

#PS:要转载请注明出处,本人版权所有

#PS:这个只是 《 我自己 》理解,如果和你的

#原则相冲突,请谅解,勿喷

最近修改一个程序,增加了一些功能,为了方便移植,要用到C++11的正则表达式(正则用起来顺手)。这里我就想说明的是:TMD,GCC 语法实现了,库没有写完。。。QAQ,WC。什么不说了。

目标:得到url(类似http://1.1.1.1:9001/group1/M00/00/37/wKgfdVoNSTKAKXAzAAD25Sg6ZTE5747.gz)中的文件名(wKgfdVoNSTKAKXAzAAD25Sg6ZTE5747.gz)。

    /*file_path = 类似http://1.1.1.1:9001/group1/M00/00/37/wKgfdVoNSTKAKXAzAAD25Sg6ZTE5747.gz
*/
    std::string Target_FileName;

    std::string pattern(".*/([^/]+\\.[a-zA-Z]+)");
    std::regex re(pattern);
    std::match_results<std::string::const_iterator> result;
    //std::smatch == std::match_results<std::string::const_iterator>

    if ( !std::regex_match(file_path,result,re) ){

        yUpgradeLog_Msg("std::regex_match false.");
        return -1;
    }
    yUpgradeLog_Msg(result.size());
    Target_FileName = result[1];

得到了下面如图的问题:
这里写图片描述

于是我去网上找答案,
问题出在我构造正则表达式的时候。也就是这句中,std::string pattern(“.*/([^/]+\.[a-zA-Z]+)”);于是我重新修改了表达式N次还是不行,没有办法了,只有去网络海洋去在瞧一瞧看一看。

最终,我看到了一个消息,给了我一点提示,文中说,可能和GCC版本有关,如果要正常使用C++11的正则表达式,需要注意GCC版本必须为4.9+,WC,TMD,赶紧去看看GCC版本。
这里写图片描述
然后赶紧使用5.4的gcc再试试如下的代码,过了。我真是无F*uck说。

#include <regex>
#include <iostream>
int main(){


    std::string pattern(".*/([^/]+\\.[a-zA-Z]+)");
    std::regex re(pattern);
    std::match_results<std::string::const_iterator> result;
    //std::smatch == std::match_results<std::string::const_iterator>
    std::string t = "http://1.1.1.1:9001/group1/M00/00/37/wKgfdVoNSTKAKXAzAAD25Sg6ZTE5747.gz";
    if ( !std::regex_match(t,result,re) ){

        std::cout<<"std::regex_match false.";
        return -1;
    }

    std::cout<<"result is "<<result[1];
    return 0;
}

这里写图片描述

这里写图片描述

最后在说一下不用正则怎么实现的吧!(其实,下面的还要简单点,感觉自己 大写的 ZZ 了,不过涨姿势了。)

file_path="http://1.1.1.1:9001/group1/M00/00/37/wKgfdVoNSTKAKXAzAAD25Sg6ZTE5747.gz";
file_path.substr(file_path.rfind("/")+1);

#PS:请尊重原创,不喜勿喷

#PS:要转载请注明出处,本人版权所有.

有问题请留言,看到后我会第一时间回复

猜你喜欢

转载自blog.csdn.net/u011728480/article/details/78931244
今日推荐