这是我的代码,如果我将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]
返回真正的字符串
答案 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);
};