任何更熟悉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)
最后一件事是有效的.添加我在组中的任何剩余字符 - %*+-.(转义或不转换) - 打破它.
所以我知道GCC直到GCC 4.9正式才支持c++11正则表达式库。请参阅gcc 4.8 或更早版本是否有关于正则表达式的错误?。由于它太新了,很可能有一些错误需要解决。确定确切的原因很困难,但问题在于实现而不是正则表达式。
旁注:当我找到上述文章并意识到我使用的是 gcc 4.8.* 时,我记得有一次花了 20 分钟试图找出我的正则表达式出了什么问题。由于我必须运行的机器不是我的,所以我基本上最终在一个不同的、类似的平台上使用更高版本的 gcc 和一些 hack 进行编译,然后它在目标平台上运行。