1. 程式人生 > >terminate called after throwing an instance of 'std::regex_error'(C++11)

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

#PS:要轉載請註明出處,本人版權所有

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

#原則相沖突,請諒解,勿噴

最近修改一個程式,增加了一些功能,為了方便移植,要用到C++11的正則表示式(正則用起來順手)。這裡我就想說明的是:TMD,GCC 語法實現了,庫沒有寫完。。。QAQ,WC。什麼不說了。

    /*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:要轉載請註明出處,本人版權所有.

有問題請留言,看到後我會第一時間回覆