4

我正在尝试使一段简单的代码与boost::is_any_ofand一起使用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), " ");

但是,我收到了一个编译器错误,该错误太长,无法粘贴到此处。有这两个功能经验的人可以指出我的错误吗?

4

2 回答 2

8

我不认为你不能。的三个参数版本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;
}

希望有帮助。

于 2013-02-06T16:45:49.983 回答
2

我对那个特定方法并不太熟悉,但它似乎replace_all_copy只需要一个替换字符串而不是is_any_of.

浏览字符串算法的其他选项,我注意到有一个正则表达式版本也可以工作:

#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 正则表达式库。就我而言,我使用:

g++ -L/usr/local/Cellar/boost/1.52.0/lib -lboost_regex-mt main.cpp

于 2013-02-06T16:44:08.190 回答