gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 15:27:45 26 4
gpt4 key购买 nike

谁能更熟悉 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;
}

我假设我使用的是 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 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;
}

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

更新 2

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

是最后起作用的。添加我组中剩余的任何字符 - %*+-.(转义或未转义)- 打破它。

最佳答案

所以我知道 GCC 直到 GCC 4.9 才正式支持 c++11 regex 库。参见 Is gcc 4.8 or earlier buggy about regular expressions? .由于它太新了,它很可能有一些错误需要解决。查明确切原因很困难,但问题出在实现中,而不是在正则表达式中。

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

关于c++ - gcc 4.9.2 和 gcc 5.3 之间正则表达式支持的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36720276/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com