【问题标题】:Strange bug - std::regex matches only first two strings [duplicate]奇怪的错误 - std::regex 仅匹配前两个字符串 [重复]
【发布时间】:2012-04-03 14:09:14
【问题描述】:

今天我在我的应用程序中遇到了奇怪的错误。我已经测试了大约 2 个小时,但没有找到解决方案。也许你可以帮我解决这个问题。所以这里是:

#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)。

【问题讨论】:

  • 在我的 gcc 4.6.2 上,我什至无法正确编译代码。 std::regex 是 TR1 的一部分,所以它应该是 #include &lt;tr1/regex&gt;std::tr1::regexstd::tr1::regex_match。一旦不碍事,它就不会链接:我在使用g++-4.6.2 -std=c++0x foo.cc 时收到来自stackoverflow.com/questions/2860722/… 的错误。您能否提供更多关于代码在您的环境中如何运行的详细信息?
  • P.S.问题几乎可以肯定是向量初始化器。我对 C++0x 了解不多,无法说出您编写的代码是做什么的,但这是可疑的部分。或许您应该尝试用老式的方式构建向量,看看是否可行?
  • @Borealid:没关系。当使用-std=c++0x 编译时,std::regex 确实存在于&lt;regex&gt; 中。向量初始化器也可以(看看它如何正确打印内容)。

标签: c++ regex linux c++11


【解决方案1】:

regex 库大部分尚未在 libstc++ 中实现(参见status page)。这可能是一个错误,也可能只是未实施的结果。我建议使用Boost.Regex 作为替代品。

【讨论】:

  • 就个人而言,除非我需要 ICU 支持,否则我总是会选择 Boost.Xpressive 而不是 Boost.Regex。
猜你喜欢
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
相关资源
最近更新 更多