return boost :: smatch并获得子串" \ 000"

时间:2016-02-22 15:54:18

标签: c++ boost

这是我的代码,如果我将boost :: regex_search提取到函数#match

,我会得到凌乱的代码
boost::smatch match() {
    std::string s = "foobar";
    std::string re_s = "f(oo)(b)ar";
    boost::regex re(re_s);
    boost::smatch what;
    if (boost::regex_search(s, what, re)) {
        return what;
    }
}

int main(int argc, char **argv) {
    boost::smatch what = match();
    std::cout << what.size() << std::endl;
    std::cout << what[0] << std::endl;
    std::cout << what[1] << std::endl;
    std::cout << what[2] << std::endl;
    return (0);
};

输出是:

3
\000\000\000\000\000
\000\000
\000

如何让what[n]返回真正的字符串

3 个答案:

答案 0 :(得分:0)

boost::smatch包含string::iterator值,用于在内部跟踪匹配项。您正在匹配堆栈中的string对象。当match()函数返回时,该字符串被破坏,迭代器变为无效。尝试将字符串s移至main()函数,并将其作为参考传递给match()

答案 1 :(得分:0)

在Boost中,operator[](int index)的{​​{1}}会返回smatch,这是const_reference的typedef。 sub_match<BidirectionalIterator>对字符串有一个强制转换运算符,但是必须将匹配转换为字符串,否则它会调用sub_match<BidirectionalIterator>函数,该函数返回距离上一次匹配的距离。如果您将operator<<(basic_ostream,sub_match)投射到what[0],则会打印出来。 (我在我的机器上测试过。)

这是我使用的代码:

std::string

答案 2 :(得分:0)

如果只想使用正则表达式,请使用std :: regex_search而不是boost :: regex_search,这样做效果很好。

#include "boost/regex.hpp"
#include "iostream"
#include "regex"

std::smatch match() {
    std::string s = "foobar";
    std::string re_s = "f(oo)(b)ar";
    std::regex re(re_s);
    std::smatch what;
    if (std::regex_search(s, what, re)) {
        return what;
    }
}

int main(int argc, char **argv) {
    std::smatch what = match();
    std::cout << what.size() << std::endl;
    std::cout << what[0].str() << std::endl;
    std::cout << what[1].str() << std::endl;
    std::cout << what[2].str() << std::endl;
    return (0);
};