C++ 2011 std::正则表达式根本不起作用

C++ 2011 std::regex doesn't work at all

本文关键字:不起作用 正则表达式 std C++ 2011      更新时间:2023-10-16

首先,我想为我的英语道歉。

我正在做一个小型C++项目,我想保持它的小型化。主要的问题是我需要使用regex,但它们并没有按照我需要的方式工作。

这很好:

std::string s ("subject");
std::regex e ("(sub)(.*)");
if (std::regex_match (s,e))
  std::cout << "string object matchedn";

这个也很好用:

std::string s ("0");
std::regex e ("[0-9]", std::regex::extended);
if (std::regex_match (s,e))
  std::cout << "string object matchedn";

即使我将std::regex::extended更改为std::正则表达式::awk、basic或其他任何代码都不起作用:

std::string s ("00");
std::regex e ("[0-9]{2}", std::regex::extended);
if (std::regex_match (s,e))
  std::cout << "string object matchedn";

我做错什么了吗?

我知道std::regex还没有完成,但我认为它们应该在这样一个简单的正则表达式中工作。

不管怎样,如果有人能给我一个小的regex库(请不要boost),我将不胜感激。

传统信息

我在Linux Ubuntu 12.10上工作,编译器是gcc>4.7

编辑:

@jalf:它编译了,但在最后一个结果中给了我一个错误的结果。它给出了一个错误。无法显示任何结果,因为我今天在客户端,无法访问该程序。

@KennyTM:是的,又是gcc/libstdc++,我一直在阅读这个论坛,寻找答案。再说一遍,我不能使用助推。

@Pete Becker:是的,它是gcc>4.7版本。记不清确切的版本了。

它确实有效。在VS2012上,我每个都有一个匹配项。

  • "subject"与"(sub)(.*)"匹配,因为它包含"sub"和.*(其他任何内容)
  • "0"与"[0-9]"匹配,因为它包含一个介于0和9之间的数字
  • "00"与"[0-9]{2}"匹配,因为它包含介于0和9之间的两位数字

对我来说,在VS2008上这似乎很有效:

#include <iostream>
#include <regex>
void main()
{
    std::string s ("00");
    std::tr1::regex e ("[0-9]{2}", std::tr1::regex::extended);
    if (std::tr1::regex_match (s,e))
        std::cout << "string object matchedn";
}  

至少如果你在windows上,那么根据MSDN上TR1正则表达式的摘要(http://msdn.microsoft.com/en-us/library/bb982727.aspx)它应该有效,只是在某些情况下,您可能需要转义大括号(请参阅"语法摘要"一节中的表)。如果您使用的是Linux,那么我想您需要查阅有关此主题的gcc文档。

请一位朋友在Linux上运行您的原始代码(gcc版本4.6.3(Ubuntu/Linaro 4.6.3-1ubuntu5)),但它不起作用,所以问题似乎是Linux特有的。逃避大括号也不起作用。