替换字符串中的单词而不跳过空格

时间:2014-12-12 16:11:04

标签: c++ regex string whitespace

我有一个包含句子的字符串。我必须搜索并替换该字符串中的特定单词。在我的情况下,我有一个行的向量和另一个要替换的单词向量。 这是我的函数,它生成一个带有最终文本的文件:

void Generator::generate_file(const string& fileName){
    string inBuffer, outBuffer;
    std::stringstream ss;
    std::ofstream outFile;
    outFile.open(fileName);
    for (const auto& inIT : userCode){ 
        //userCode is a vector which contains lines of text
        ss.str(inIT);
        ss.clear();
        outBuffer = "";
        while (ss >> inBuffer){
            for (auto keyIT : keywords){
               //keywords is a vector which contains words to replace
                if (keyIT == inBuffer)
                    inBuffer = "REPLACED";
            }
            outBuffer += inBuffer + " ";
        }
        outFile << outBuffer << endl;
    }
    outFile.close();
}

此功能的问题在于它会跳过所有空格。我在输出文件中需要它们。我该怎么做才能实现这一目标? 您可以在下面看到它的工作原理示例:

USERCODE

userCode[0] = "class UrlEncoder(object): class";
userCode[1] = "    def __init__(self, alphabet=DEFAULT_ALPHABET,\n block_size=DEFAULT_BLOCK_SIZE):";

显示userCode向量:

class UrlEncoder(object):
    def __init__(self, alphabet=DEFAULT_ALPHABET, block_size=DEFAULT_BLOCK_SIZE):

执行我的功能后,它看起来像这样:

REPLACED UrlEncoder(object): 
REPLACED __init__(self, alphabet=DEFAULT_ALPHABET, block_size=DEFAULT_BLOCK_SIZE):

正如您所看到的,它正确地替换了关键字。但不幸的是,它跳过了制表机。

1 个答案:

答案 0 :(得分:1)

主要问题是流提取>>运算符的工作方式。在读取下一个格式化输入时,它会删除并丢弃任何前导空白字符。假设你想在抓取输入时坚持使用ss >> inBuffer,你需要找到一些在执行任何输入提取之前先抢占任何前导空格。

例如,

string eatwhite(const string &str, size_t pos)
{
  size_t endwhite = str.find_first_not_of(" \t\n", pos);
  if (endwhite == string::npos) return "";
  return string(str.begin() + pos, str.begin() + endwhite);
}

现在,您可以在执行任何eatwhite之前致电>>

    string outBuffer = eatwhite(ss.str(), ss.tellg());
    while (ss >> inBuffer)
    {
        for (auto keyIT : keywords)
        {
           //...
        }
        string whitesp = eatwhite(ss.str(), ss.tellg());
        outBuffer += inBuffer + whitesp;
    }
    outFile << outBuffer << endl;