gcc 4.9.2和gcc 5.3在regex支持方面的差异
Differences in regex support between gcc 4.9.2 and gcc 5.3
熟悉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和一些技巧,然后它在目标平台上运行。
相关文章:
- GCC 7 C++17支持折叠表达式
- GCC 不支持新表达式中的大括号省略号
- gcc 是否支持 -static-libgcc 和 -fexceptions?
- 为什么 GCC 6.3 在没有显式 C++11 支持的情况下编译此大括号初始化列表代码
- OSX 上的 GCC 5、6 和 7 不支持 uint
- GCC是否支持宏定义中的多行原始字符串文字
- 既然C++14支持哪个版本的GCC
- 无法使用 GCC 编译器 4.7.3 在 AIX 上编译具有线程支持的 c++ 程序
- 如何获得GCC版本支持特定功能
- 要使 gcc 4.8.1 支持 c++11 中的新"auto"功能?
- Solaris 上的 GNU gcc/g++ 编译器版本,支持 C++11/14
- GCC 4.4 不实现 C++11 范围循环.它还支持哪些其他范围循环语法
- 为什么 gcc-4.9.2 不能支持 std::string.insert(迭代器,范围)返回迭代器
- CUDA 7.0抱怨不支持gcc 4.9
- gcc 4.9.2和gcc 5.3在regex支持方面的差异
- 最低合理支持的GCC版本是什么
- GCC 编译器是否支持经典C++
- gcc支持cbegin和cend方法
- gcc 4.8.1支持c++ 11中的垃圾回收吗?
- cygwin上的gcc 4.7.3支持c++ 11并发特性吗?