我正在尝试使用boost::is_any_of
和boost::replace_all_copy
制作一段简单的代码。该片段如下:
std::string someString = "abc.def-ghi";
std::string toReplace = ".-";
std::string processedString = boost::replace_all_copy(someString, boost::is_any_of(toReplace), " ");
但是,我得到的编译器错误太长而无法在此处粘贴。有经验这两个功能的人可以指出我的错误吗?
答案 0 :(得分:7)
我认为你不能。 The three parameter version of boost::replace_all_copy
获取输入字符串,替换字符串和要搜索的字符串。 boost::is_any_of
返回的是谓词仿函数。
您可能想要的是boost::replace_if
:
#include <boost/algorithm/string.hpp> // for is_any_of
#include <boost/range/algorithm/replace_if.hpp> // for replace_if
#include <string>
#include <iostream>
std::string someString = "abc.def-ghi";
std::string toReplace = ".-";
std::string processedString =
boost::replace_if(someString, boost::is_any_of(toReplace), ' ');
int main()
{
std::cout << processedString;
}
这会修改原件,因此如果您需要保留原件,可以使用boost::replace_copy_if
:
#include <boost/algorithm/string.hpp>
#include <boost/range/algorithm/replace_copy_if.hpp>
#include <string>
#include <iostream>
#include <iterator> // for back_inserter
std::string someString = "abc.def-ghi";
std::string toReplace = ".-";
int main()
{
std::string processedString;
boost::replace_copy_if(someString,
std::back_inserter(processedString), boost::is_any_of(toReplace), ' ');
std::cout << processedString;
}
希望有所帮助。
答案 1 :(得分:2)
我对这个特定方法并不过分熟悉,但似乎replace_all_copy
只想要一个替换字符串而不是is_any_of
的结果。
浏览string algorithms的其他选项我注意到有一个正则表达式版本也可以使用:
#include <iostream>
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/regex.hpp>
int main(int argc, char** argv) {
std::string someString = "abc.def-ghi";
std::cout << someString << std::endl;
std::string toReplace = "[.-]"; // character class that matches . and -
std::string replacement = " ";
std::string processedString =
boost::replace_all_regex_copy(someString, boost::regex(toReplace), replacement);
std::cout << processedString << std::endl;
return 0;
}
输出:
abc.def-ghi
abc def ghi
这确实需要链接到boost regex lib。就我而言,我建立了:
g++ -L/usr/local/Cellar/boost/1.52.0/lib -lboost_regex-mt main.cpp