5

使 C++ 正则表达式字符串捕获工作。我已经尝试过 Windows 与 Linux、Boost 与原生 C++ 0x11 的所有四种组合。示例代码是:

#include <string>
#include <iostream>
#include <boost/regex.hpp>
//#include <regex>

using namespace std;
using namespace boost;

int main(int argc, char** argv)
{
    smatch sm1;
    regex_search(string("abhelloworld.jpg"), sm1, regex("(.*)jpg"));
    cout << sm1[1] << endl;
    smatch sm2;
    regex_search(string("hell.g"), sm2, regex("(.*)g"));
    cout << sm2[1] << endl;
}

最接近的是 g++ (4.7) 和 Boost (1.51.0)。在那里,第一个 cout 输出预期的abhelloworld.结果,但第二个 cout 没有输出。

g++ 4.7 与 -std=gnu++11 而<regex>不是不<boost/regex.hpp>产生输出。

使用本机的 Visual Studio 2012 会<regex>产生关于不兼容字符串迭代器的异常。

带有 Boost 1.51.0 的 Visual Studio 2008 并<boost/regex.hpp>产生关于“标准 C++ 库无效参数”的异常。

这些是 C++ 正则表达式中的错误,还是我做错了什么?

4

2 回答 2

7

这些是 C++ 正则表达式中的错误,还是我做错了什么?

在您发布时,gcc 不支持<regex>,如另一个答案中所述(现在支持)。至于其他问题,您的问题是您正在传递临时字符串对象。将您的代码更改为以下内容:

smatch sm1;
string s1("abhelloworld.jpg");
regex_search(s1, sm1, regex("(.*)jpg"));
cout << sm1[1] << endl;
smatch sm2;
string s2("hell.g");
regex_search(s2, sm2, regex("(.*)g"));
cout << sm2[1] << endl;

您的原始示例可以编译,因为regex_search它接受了一个临时对象可以绑定到的 const 引用,但是,smatch它只将迭代器存储到您不再存在的临时对象中。解决方案是不通过临时人员。

如果您查看 [§ 28.11.3/5] 中的 C++ 标准,您会发现以下内容:

返回: regex_search(s.begin(), s.end(), m, e, flags) 的结果。

这意味着在内部,仅使用传入字符串的迭代器,因此如果传入一个临时对象,则将使用该临时对象的迭代器,这些迭代器是无效的,并且实际临时对象本身不会被存储

于 2012-08-25T21:12:34.407 回答
0

GCC 还不支持<regex>。参考手册

于 2012-08-25T19:39:50.797 回答