2012-03-19 43 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