terminate called after throwing an instance of 'std::regex_error'(C++11)
阿新 • • 發佈:2019-02-14
#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:要轉載請註明出處,本人版權所有.
有問題請留言,看到後我會第一時間回覆