替换字符串中的单词而不跳过空格
Posted
技术标签:
【中文标题】替换字符串中的单词而不跳过空格【英文标题】:Replace words in a string without skipping whitespaces 【发布时间】:2014-12-12 16:11:04 【问题描述】:我有一个包含句子的字符串。我必须搜索并替换该字符串中的特定单词。就我而言,我有一个线向量和另一个要替换的词向量。 这是我生成带有最终文本的文件的函数:
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[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):
如您所见,它正确替换了关键字。但不幸的是它跳过了制表符。
【问题讨论】:
“跳过所有空格”是什么意思? @j_random_hacker 我已经编辑了我的问题并添加了一个示例。我希望现在更清楚了。 【参考方案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;
【讨论】:
非常感谢。你拯救了这一天。以上是关于替换字符串中的单词而不跳过空格的主要内容,如果未能解决你的问题,请参考以下文章
从 excel/文本文件中读取而不跳过空格,除非由选项卡制作