C++ GCC4.8或更早版本是否存在关于正则表达式的错误?

C++ GCC4.8或更早版本是否存在关于正则表达式的错误?,c++,regex,gcc,c++11,libstdc++,C++,Regex,Gcc,C++11,Libstdc++,我试图在一段C++11代码中使用std::regex,但它的支持似乎有点缺陷。例如: #include <regex> #include <iostream> int main (int argc, const char * argv[]) { std::regex r("st|mt|tr"); std::cerr << "st|mt|tr" << " matches st? " << std::regex_match

我试图在一段C++11代码中使用std::regex,但它的支持似乎有点缺陷。例如:

#include <regex>
#include <iostream>

int main (int argc, const char * argv[]) {
    std::regex r("st|mt|tr");
    std::cerr << "st|mt|tr" << " matches st? " << std::regex_match("st", r) << std::endl;
    std::cerr << "st|mt|tr" << " matches mt? " << std::regex_match("mt", r) << std::endl;
    std::cerr << "st|mt|tr" << " matches tr? " << std::regex_match("tr", r) << std::endl;
}
使用gcc MacPorts gcc47 4.7.1_2 4.7.1编译时

g++ *.cc -o test -std=c++11
g++ *.cc -o test -std=c++0x

此外,如果我只有两种可选模式,例如st|mt,则正则表达式工作得很好,因此由于某些原因,最后一种模式似乎不匹配。该代码与Apple LLVM编译器配合良好

关于如何解决这个问题有什么想法吗

更新一个可能的解决方案是使用组来实施多个备选方案,例如st | mt | tr。

在GCC 4.9.0中实施并发布

在旧版本的GCC中,它是

该原型代码是在GCC的所有C++0x支持都是高度实验性的时候添加的,它跟踪早期的C++0x草案,并提供给人们进行实验。这使得人们能够在标准最终确定之前发现问题并向标准委员会提供反馈。当时,很多人都很感激在C++11完成之前以及在许多其他编译器提供任何支持之前很久就已经能够访问最前沿的功能,而这些反馈确实帮助改进了C++11。这是件好事

该代码从未处于有用状态,而是像当时的许多其他代码位一样作为正在进行的工作添加。它被签入并提供给其他人,如果他们愿意的话,可以进行协作,目的是最终完成它

这就是开源的工作原理:-不幸的是,在我们的例子中,我们只对了早期部分,而没有完成实现的经常部分

库的大部分部分都比较完整,现在几乎完全实现了,但还没有实现,所以它自添加以来一直处于未完成状态


但说真的,谁认为发布一个只返回false的regex_搜索实现是个好主意

这在几年前还不是一个坏主意,当时C++0x仍在开发中,我们提供了很多部分实现。没有人认为它会在这么长时间内不可用,所以事后看来,也许它应该被禁用,并且需要一个宏或构建时选项来启用它。但是那艘船很久以前就开航了。有从libstdc++导出的符号。所以库依赖于正则表达式代码,所以简单地在GCC 4.8中删除它并不是件小事。

Feature Detection 这是一个用于检测libstdc++实现是否使用C预处理器定义实现的代码段:

包括 如果uu cplusplus>=201103L&&\ !定义的_uuuglibcxx_uu||uuuuu cplusplus>=201402L|124;\ 定义的_GLIBCXX _REGEX _DFS _量词| | |\ 定义的_GLIBCXX_REGEX_STATE_LIMIT|\ 已定义的\u GLIBCXX \u发布和\ _GLIBCXX_发布>4 定义HAVE_WORKING_REGEX 1 其他的 定义HAVE_WORKING_REGEX 0 恩迪夫 宏 _GLIBCXX_REGEX_DFS_量词_限制在4.9.x中的位/REGEX.tcc中 _GLIBCXX_REGEX_STATE_LIMIT以位/REGEX_automatron.h表示,单位为5+ _GLIBCXX_发行版作为的结果添加到7+,是GCC的主要版本 测试 您可以使用GCC对其进行如下测试:

cat=201103L&&\ !定义的_uuuglibcxx_uu||uuuuu cplusplus>=201402L|124;\ 定义的_GLIBCXX _REGEX _DFS _量词| | |\ 定义的_GLIBCXX_REGEX_STATE_LIMIT|\ 已定义的\u GLIBCXX \u发布和\ _GLIBCXX_发布>4 定义HAVE_WORKING_REGEX 1 其他的 定义HAVE_WORKING_REGEX 0 恩迪夫 包括 int main{ 常量std::regex regex.*; const std::string string=这应该匹配!; const auto result=std::regex\u searchstring,regex; 如果你有工作经验 标准:cerr=201103L,但YMMV


显然,如果有人在stdc++-v3头文件之外定义了_GLIBCXX_REGEX_DFS_QUANTIFIERS_LIMIT或_GLIBCXX_REGEX_STATE_LIMIT宏,这将完全破坏。目前,在g++GCC 4.9.2中使用std=c++14仍然不接受REGEX_匹配

这里有一种类似于regex_match的方法,但使用sregex_token_迭代器

string line="1a2b3c";
std::regex re("(\\d)");
std::vector<std::string> inVector{
    std::sregex_token_iterator(line.begin(), line.end(), re, 1), {}
};

//prints all matches
for(int i=0; i<inVector.size(); ++i)
    std::cout << i << ":" << inVector[i] << endl;
它将打印1 2 3

您可以在以下位置阅读sregex_token_迭代器参考:

是的,libstdc++的支持不完整。我们能为您提供什么帮助?关于libstdc++中regex的状态,请认真查看,谁认为发布一个只返回false的regex_搜索实现是一个好主意?哦,我们记录了这似乎是一个很弱的回答。@AK4749:这不是一个错误。它只是完全没有实现。尽管这个问题出现的次数令人震惊,特别是在过去3-4年里,libstdc++没有发生任何变化,如:它仍然没有实现。@KeithThompson,虽然libstdc++提供的是GCC标准库,而不是GCC编译器前端,但它是GCC项目的一部分。请参阅。如果y
我们的发行版选择将其拆分成一个与GCC无关的单独包。非常好!我打算建议从GCC 4.9中新增的一个头文件中检查header guard宏,但它们没有保护:-\GCC 7中的宏没有变化,但理论上它们可以用于GCC 8+,因此请在请求时提交一个增强请求,要求在头文件中添加类似“GLIBCXX\u REGEX\u is\u OK\u NOW\u KTHXBAI”的内容,所以它不会被忘记-谢谢@乔纳森·韦克利补充道。我不知道如何把它变成一个增强bug,但它现在在系统中。目前,在g++GCC4.9.2中使用std=c++14仍然不接受正则表达式匹配。那不是真的,你可能用错了。你的代码不是一种像regex_match那样工作的方法,因为该函数试图匹配子字符串,而不是整个字符串,所以我仍然认为你用错了。不过,您可以使用std::regex_搜索来完成,请参见
g++ *.cc -o test -std=gnu++0x
string line="1a2b3c";
std::regex re("(\\d)");
std::vector<std::string> inVector{
    std::sregex_token_iterator(line.begin(), line.end(), re, 1), {}
};

//prints all matches
for(int i=0; i<inVector.size(); ++i)
    std::cout << i << ":" << inVector[i] << endl;