我正在尝试使用lambda函数调用boost::regex_replace
类型的std::string
。我没有运气得到所有类型的正确。
typedef boost::basic_regex<char> regex;
typedef boost::match_results<char> smatch;
std::string text = "some {test} data";
regex re( "\\{([^\\}]*)\\}" );
text = boost::regex_replace( text, re, [&](smatch const & what) {
return what.str();
});
我使用typedef
而不是标准名称,因为我有一些地方使用typedef / templated字符类型而不是固定类型。
在此代码中,我收到此错误:/usr/include/boost/regex/v4/match_results.hpp:68:77: error: no type named 'difference_type' in 'struct boost::re_detail::regex_iterator_traits<char>'
BidiIterator>::difference_type difference_type;
答案 0 :(得分:2)
如记录on the match_results reference page,boost::match_results
的第一个类型参数是BidirectionalIterator类型;因此,例如,标准typedef boost::smatch
为match_results<std::string::const_iterator>
。
要修复代码,您需要更正smatch
typedef并删除lambda参数what
上的引用或使其成为const引用:
typedef boost::basic_regex<char> regex;
typedef boost::match_results<std::string::const_iterator> smatch;
std::string text = "some {test} data";
regex re("\\{([^\\}]*)\\}");
text = boost::regex_replace(text, re, [] (const smatch& what) {
return what.str();
});
答案 1 :(得分:1)
如果你有一个符合C ++ 11的编译器,你既不需要Boost也不需要lambda。
要实现相同的目标,您只需使用std::regex
:
#include <iostream>
#include <regex>
int main()
{
std::string text = "some {test} data {asdf} more";
std::regex re("\\{([^\\}]*)\\}");
std::string out;
std::string::const_iterator it = text.cbegin(), end = text.cend();
for (std::smatch match; std::regex_search(it, end, match, re); it = match[0].second)
{
out += match.prefix();
out += match.str(); // replace here
}
out.append(it, end);
std::cout << out << std::endl;
}
当然,对于简单的文本替换,您可以使用std::regex_replace()
,但它无法接受仿函数,只能接受静态格式字符串,可选择使用组占位符:
std::string text = "some {test} data {asdf} more";
std::regex re("\\{([^\\}]*)\\}");
std::string out = std::regex_replace(text, re, "<$1>");
答案 2 :(得分:0)
smatch
类型有问题。我找不到一个带有typename的工作示例,但使用C ++ 14 auto lambda参数解决了这个问题:
auto text = "some {test} data";
regex re( "\\{([^\\}]*)\\}" );
text = boost::regex_replace( text, re, [&](auto & what) {
return what.str();
});