C++ gcc 4.9.2和gcc 5.3之间正则表达式支持的差异

C++ gcc 4.9.2和gcc 5.3之间正则表达式支持的差异,c++,regex,gcc,C++,Regex,Gcc,熟悉gcc的人能指出为什么下面的示例在gcc 4.9.2上不匹配,但在gcc 5.3上成功了吗?我能做些什么来改变这种模式,使其工作(在VS 2013上似乎也能正常工作) 这是最后一个有效的方法。添加组中剩余的任何字符-%*+-.(转义或非epscaped)-会破坏它。因此我知道GCC在GCC 4.9正式发布之前不支持c++11正则表达式库。看见因为它是如此的新,它很可能有一些bug需要消除。确定确切的原因是困难的,但问题在于实现,而不是正则表达式 旁注:我记得有一次我花了20分钟试图找出我的正

熟悉gcc的人能指出为什么下面的示例在gcc 4.9.2上不匹配,但在gcc 5.3上成功了吗?我能做些什么来改变这种模式,使其工作(在VS 2013上似乎也能正常工作)


这是最后一个有效的方法。添加组中剩余的任何字符-
%*+-.
(转义或非epscaped)-会破坏它。

因此我知道GCC在GCC 4.9正式发布之前不支持c++11正则表达式库。看见因为它是如此的新,它很可能有一些bug需要消除。确定确切的原因是困难的,但问题在于实现,而不是正则表达式


旁注:我记得有一次我花了20分钟试图找出我的正则表达式出了什么问题,当时我发现了上面提到的文章,并意识到我使用的是GCC4.8。*。由于我必须运行的机器不是我的,我基本上是在一个不同的、类似的平台上编译的,有一个更高版本的gcc和一些黑客攻击,然后它在目标平台上运行。

可能与:作为旁注,我建议使用原始字符串文字来限制反斜杠的冲击。@NathanOliver我没有完全理解这一点-这意味着我在gcc 4.9.2中使用的
libstdc++
版本应该受到指责?@RudolfsBundulis这是可能的。答案是gcc 4.9应该修复它,但4.9.2中可能有错误,因为它的实现还是新的。@user2079303谢谢,还没有设法调整它们,但它显然使事情变得更漂亮:)
#include <iostream>
#include <regex>

std::regex pattern("HTTP/(\\d\\.\\d)\\s(\\d{3})\\s(.*)\\r\\n(([!#\\$%&\\*\\+\\-\\./a-zA-Z\\^_`\\|-]+\\:[^\\r]+\\r\\n)*)\\r\\n");

const char* test = "HTTP/1.1 200 OK\r\nHost: 192.168.1.72:8080\r\nContent-Length: 86\r\n\r\n";

int main()
{
    std::cmatch results;
    bool matched = std::regex_search(test, test + strlen(test), results, pattern);
    std::cout << matched;
    return 0; 
}
#include <iostream>
#include <regex>

std::regex pattern("HTTP/(\\d\\.\\d)\\s(\\d{3})\\s(.*?)\\r\\n(?:([^:]+\\:[^\\r]+\\r\\n)*)\\r\\n");

const char* test = "HTTP/1.1 200 OK\r\nHost: 192.168.1.72:8080\r\nContent-Length: 86\r\n\r\n";

int main()
{
    std::cmatch results;
    bool matched = std::regex_search(test, test + strlen(test), results, pattern);
    std::cout << matched << std::endl;
    if (matched)
    {
        for (const auto& result : results)
        {
            std::cout << "matched: " << result.str() << std::endl;
        }
    }
    return 0;
}
std::regex pattern(R"(HTTP/(\d\.\d)\s(\d{3})\s(.*?)\r\n(?:([!#$&a-zA-Z^_`|-]+\:[^\r]+\r\n)*)\r\n)")