2012-03-19 56 views
1

今天我在我的應用程序中遇到了一個奇怪的錯誤。我已經測試了2小時,但沒有找到解決方案。也許你可以幫我解決這個問題。所以在這裏,它是:奇怪的錯誤 - std :: regex只匹配前兩個字符串

#include <iostream> 
#include <regex> 
#include <vector> 

int main() 
{ 
     std::regex reg("rmvb|avi|rm|mp4|256"); 

     std::vector<std::string> ext{"rmvb", "avi", "rm", "mp4", "256", "null"}; 

     for (int i = 0; i < 6; i++) 
     { 
       std::cout << ext[i] << "\t" << std::boolalpha << std::regex_match(ext[i], reg) << std::endl; 
     } 

     return 0; 
} 

輸出:

rmvb true 
avi true 
rm false 
mp4 false 
256 false 
null false 

看來,圖案是第二個元素後丟棄 - 不管我選擇什麼樣的順序(我試圖交換它們,因爲我認爲數字可以導致這個錯誤 - 但他們不是)。現在我不知道發生了什麼事。

我使用的是gcc版本4.6.3(Debian 4.6.3-1)。

+0

在我的gcc 4.6.2上,我甚至無法正確編譯代碼。 'std :: regex'是TR1的一部分,所以它應該是'#include ','std :: tr1 :: regex'和'std :: tr1 :: regex_match'。一旦出現這種情況,它不會鏈接:當使用'g ++ - 4.6.2 -std ='時,我從http://stackoverflow.com/questions/2860722/linker-error-when-using-tr1regex得到錯誤。 C++ 0x foo.cc'。你能否提供一些關於代碼如何在你的環境中運行的更多細節? – Borealid 2012-03-19 02:37:20

+0

P.S.問題幾乎肯定是矢量初始化器。我不太瞭解C++ 0x來說明你寫的代碼的作用,但這是可疑的部分。也許你應該嘗試用傳統的方式來構建這個載體,看看它是否能夠工作? – Borealid 2012-03-19 02:40:02

+0

@Borealid:沒關係。當用'-std = C++ 0x'編譯時,'std :: regex'確實存在於''中。矢量初始化器也可以(請參閱它如何正確打印內容)。 – 2012-03-19 02:42:06

回答

3

正則表達式庫大部分尚未在libstC++中實現(參見status page)。這可能是一個錯誤或者是它沒有被執行的結果。我建議使用Boost.Regex作爲替代。

+1

個人而言,除非我需要ICU的支持,否則我總是會選擇[Boost.Xpressive](http://www.boost.org/libs/xpressive/)Boost.Regex。 – ildjarn 2012-03-19 04:28:33