如何在字符串中替换多组关键字?

时间:2017-06-04 14:11:36

标签: c++ string replace

所以我有一个我正在阅读的字符串文件,我必须用其他值替换它们中的某些值。可能的替换量是可变的。如同,它从文件中读取要替换的模式。目前我正在vector<pair<string,string>>存储模式以查找和匹配。但是我遇到了问题:

  

示例:

     

输入字符串:abcd.eaef%afas&333

     

分隔符模式:

     
    

. %%%

         

% ###

         

& @@@

  
     

我想要的输出:abcd%%%eaef###afas@@@333

     

输出我得到:abcd#########eaef###afas@@@333

问题是它最终取代%符号或任何已经替代其他东西的符号,它不应该这样做。

我的代码是(相关部分):

std::string& replace(std::string& s, const std::string& from, const std::string& to){
    if(!from.empty())
        for(size_t pos = 0; (pos = s.find(from, pos)) != std::string::npos; pos += to.size()) s.replace(pos, from.size(), to);
    return s;
}
string line;
vector<pair<string, string>> myset;
while(getline(delimiterfile, line)){
    istringstream is(line);
    string delim, pattern;
    if(is >> delim >> pattern){
        myset.push_back(make_pair(delim, pattern));
    } else {
        throw runtime_error("Invalid pattern pair!");
    }
}

while(getline(input, line)){
    string temp = line;
    for(auto &item : myset){
        replace(temp, item.first, item.second);
    }
    output << temp << endl;
}

有人可以告诉我我搞砸了什么以及如何解决它?

2 个答案:

答案 0 :(得分:2)

在伪代码中,简单的替换算法可能如下所示:

string input = getline();
string output;  // The string containing the replacements
for (each char in input)
{
    if (char == '.')
        output += "%%%";
    // TODO: Other replacements
    else
        output += char;
}

如果你实现上面的代码,一旦完成,变量output将包含所有替换的字符串。

答案 1 :(得分:0)

我建议您使用stringstream。通过这种方式,您将能够非常轻松地实现您的目标。