任何更熟悉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标头名称的组有关。将进一步检查。
更新2
std::regex pattern(R"(HTTP/(\d\.\d)\s(\d{3})\s(.*?)\r\n(?:([!#$&a-zA-Z^_`|-]+\:[^\r]+\r\n)*)\r\n)")
是最后一个有用的东西。添加我在群组中剩余的任何字符 - %*+-.
(转义或未转义) - 打破它。
答案 0 :(得分:1)
所以我知道GCC在GCC 4.9正式发布之前才支持c ++ 11 regex库。参见Is gcc 4.8 or earlier buggy about regular expressions?。由于它太新了,因此很可能会消除一些错误。确定确切原因很困难,但是问题出在实现中,而不是正则表达式中。
旁注:我记得花20分钟一次的时间来弄清楚我发现上述文章并意识到我正在使用gcc 4.8。*时正则表达式出了什么问题。由于我必须运行的机器不是我的机器,因此我基本上最终还是在另一个类似的平台上进行了编译,并使用了更高版本的gcc和一些技巧,然后在目标平台上运行了。