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

Rud*_*lis 11 c++ regex gcc

任何更熟悉gcc的人都可以指出为什么下面的样本在gcc 4.9.2上无法匹配但在gcc 5.3上成功了吗?有什么我可以做的来交替模式,以便它可以工作(似乎在VS 2013上工作正常)?

#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; 
}
Run Code Online (Sandbox Code Playgroud)

我假设我使用的是gcc 4.9.2中不支持但稍后添加或修复的内容,但我不知道在哪里查找它.

UPDATE

由于大量的帮助和建议,我试图回溯问题而不是仅仅切换到gcc 5.我得到了正确的匹配修改:

#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;
}
Run Code Online (Sandbox Code Playgroud)

所以我猜问题是与HTTP标头名称匹配的组.将进一步检查.

更新2

std::regex pattern(R"(HTTP/(\d\.\d)\s(\d{3})\s(.*?)\r\n(?:([!#$&a-zA-Z^_`|-]+\:[^\r]+\r\n)*)\r\n)")
Run Code Online (Sandbox Code Playgroud)

最后一件事是有效的.添加我在组中的任何剩余字符 - %*+-.(转义或不转换) - 打破它.

Hac*_*oss 2

所以我知道GCC直到GCC 4.9正式才支持c++11正则表达式库。请参阅gcc 4.8 或更早版本是否有关于正则表达式的错误?。由于它太新了,很可能有一些错误需要解决。确定确切的原因很困难,但问题在于实现而不是正则表达式。

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