gcc 4.9.2和gcc 5.3在regex支持方面的差异

Differences in regex support between gcc 4.9.2 and gcc 5.3

本文关键字:gcc 支持 方面 regex      更新时间:2023-10-16

熟悉gcc的人能指出为什么下面的示例在gcc 4.9.2上不匹配,但在gcc 5.3上成功了吗?我能做些什么来改变模式,让它发挥作用吗(在VS2013上似乎也很好)?

#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 OKrnHost: 192.168.1.72:8080rnContent-Length: 86rnrn";
int main()
{
    std::cmatch results;
    bool matched = std::regex_search(test, test + strlen(test), results, pattern);
    std::cout << matched;
    return 0; 
}

我想我使用的是gcc 4.9.2中不支持的东西,但后来添加或修复了它,但我不知道在哪里查找它。

更新

由于得到了大量的帮助和建议,我试图回溯这个问题,而不是仅仅切换到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 OKrnHost: 192.168.1.72:8080rnContent-Length: 86rnrn";
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;
}

所以我想问题出在与HTTP头名称匹配的组上。将进一步检查。

更新2

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

是最不可行的。添加我在组中剩下的任何字符-%*+-.(转义或未转义)-会破坏它。

所以我知道GCC在GCC 4.9正式发布之前并不支持c++11 regex库。请参阅gcc 4.8或更早版本对正则表达式有缺陷吗?。由于它是如此的新,它很可能有一些错误需要消除。很难确定确切的原因,但问题在于实现,而不是正则表达式。

附带说明:我记得有一次我花了20分钟试图弄清楚我的regex出了什么问题,当时我发现了上面提到的文章,并意识到我使用的是gcc 4.8.*。由于我必须运行的机器不是我的,所以我基本上是在一个不同的、类似的平台上编译的,使用了后来版本的gcc和一些技巧,然后它在目标平台上运行。