我正在尝试在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;
}


输出:

st|mt|tr matches st? 1
st|mt|tr matches mt? 1
st|mt|tr matches tr? 0


使用gcc(MacPorts gcc47 4.7.1_2)4.7.1编译时

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


要么

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


此外,如果我只有两种替代模式,例如st|mt,由于某些原因,看起来最后一个不匹配。该代码可与Apple LLVM编译器很好地配合。

关于如何解决此问题的任何想法?

更新一种可能的解决方案是使用组来实现多个替代方案,例如(st|mt)|tr

最佳答案

<regex>已在GCC 4.9.0中实施并发布。

在您的(旧)GCC版本中,它是not implemented

当GCC对C ++ 0x的所有支持都处于高度实验性,跟踪早期C ++ 0x草案并可供人们进行实验时,添加了该原型<regex>代码。这使人们能够在标准最终确定之前发现问题并向标准委员会提供反馈。当时,很多人很高兴能够在C ++ 11完成之前和许多其他编译器提供任何支持之前就获得了最先进的功能,而这些反馈确实有助于改善C ++ 11。这是一件好事。

<regex>代码从不处于有用状态,但是与当时的许多其他代码一样,它是作为进行中的工作而添加的。它已签入,并在其他人愿意的情况下可供其他人协作,以期最终完成。

开源通常是这样工作的:Release early, release often-不幸的是,在<regex>的情况下,我们只掌握了早期的部分,而没有完成该部分的通常部分。

库的大部分内容都比较完整,现在几乎已完全实现,但是<regex>尚未完成,因此自添加以来,它一直处于未完成的状态。


  认真地说,谁提供了只返回“ false”的regex_search实现呢?


几年前,C ++ 0x仍在开发中,并且交付了许多部分实现,这并不是一个坏主意。没有人认为它会这么长时间不可用,因此事后看来,也许应该禁用它,并且需要使用宏或内置时间选项才能启用它。但是那艘船早就航行了。从libstdc ++。so库中导出了依赖于正则表达式代码的符号,因此简单地删除它(例如,在GCC 4.8中)将不是一件容易的事。

关于c++ - gcc 4.8或更早的关于正则表达式的错误吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34141024/

10-14 14:25
查看更多