【问题标题】:C++ 2011 std::regex doesn't work at all [duplicate]C++ 2011 std::regex 根本不起作用 [重复]
【发布时间】:2013-06-26 08:35:27
【问题描述】:

首先我要为我的英语道歉。

我在一个小型 C++ 项目中工作,我想保持它的小。 主要问题是我需要使用正则表达式,但它们不能按我需要的方式工作。

这很好用:

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

这个也很好用:

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

即使我将 std::regex::extended 更改为 std::regex::awk、基本或其他任何代码都不起作用:

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

我做错了什么吗?

我知道 std::regex 还没有完成,但我认为它们应该以如此简单的正则表达式工作。

无论如何,如果有人能指点我一个小型正则表达式库(请不要提升),我将不胜感激。

其他信息

我正在使用 Linux Ubuntu 12.10,编译器是 gcc > 4.7

编辑:

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

@KennyTM:是的,又是 gcc/libstdc++,我一直在阅读这个论坛来寻找答案。同样,我不能使用 boost。

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

【问题讨论】:

  • 您在哪个版本中使用哪个实现?这些都是非常新的功能,我相信这些实现有不同的质量。
  • “不起作用”是什么意思?它编译吗?它会给出错误的结果吗?您期望得到哪些结果,实际得到了哪些结果?
  • 又是 gcc/libstdc++ 吗?已经有很多关于它的问题。简短回答:使用 Boost,或者切换到 clang/libc++,或者不使用它。
  • 您可能正在使用 gcc。所涉及的每个人都应该为在他们的regex 标头中发送废话而感到尴尬。

标签: c++ regex std


【解决方案1】:

确实有效。在 VS2012 上,我得到了每个匹配项。

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

【讨论】:

    【解决方案2】:

    对于 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 matched\n";
    }  
    

    至少如果您在 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 特定的。转义花括号也不起作用。

    【讨论】:

    • 是的,抱歉,忘了说我在 Linux 下工作,而不是 Windows。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多