0

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

我在一个小型 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++,我一直在阅读这个论坛来寻找答案。同样,我不能使用提升。

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

4

2 回答 2

1

对于 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 特定的。转义花括号也不起作用。

于 2013-06-26T09:03:07.943 回答
1

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

  • subject”匹配“ (sub)(.*)”,因为它包含“sub”,然后是 .*(其他任何内容)。
  • " 0" 匹配 " [0-9]" 因为它包含 0 到 9 之间的数字。
  • " 00" 匹配 " [0-9]{2}" 因为它包含 0 和 9 之间的两位数字。
于 2013-06-26T08:58:04.277 回答