自己编写的单词替换函数,主要是模拟出标准库函数replace的方法。 缺点是只能替换单词,而不是检测相符的字符并替换,如 给出 HiImLissy 需要将Lissy 替换为 lissy 则无法实现,如果需要实现对于字符匹配进行替换的话,推荐使用标准库函数。
主要使用了两种方式来进行replace。 在代码中都给出了注释以及解释。代码如下:
///使用迭代器及insert和erase函数来进行替换
void replace(std::string & ori, const std::string & oldVal, const std::string & newVal)
{
std::string::iterator beg = ori.begin();
std::string s;
int start = 0; //单词的起点位置
int offset = newVal.size() - oldVal.size(); //对于单词长度的差值
///在此处有一个例外情况 就是如果给定的string就是oldVal的话,那么直接替换就可以了。
if (ori == oldVal)
{
ori = newVal;
return;
}
///方式2 使用下标的方式进行查找替换
while (start < ori.size())
{
s.push_back(ori.at(start));
///判断条件与方式1相同
if (s == oldVal && (start + 1 == ori.size() || ori.at(start + 1) == ' '))
{
///使用replace来进行替换
ori.replace(start - (oldVal.size() - 1), oldVal.size(), newVal); //替换字符
s.clear();
start += offset + 1; //当前下标移动到newVal - oldVal 之间长度的差值之后的位置上
}
else
{
///遇到空白字符则清空字符串
if (ori.at(start) == ' ')
s.clear();
++start;
}
}
#ifdef METHOD1 ///方式1 对于迭代器方式的查找替换
while (beg != ori.end())
{
s.push_back(*beg);
///注意判断条件 如果当前的单词确定为需要查找的单词的时候
///一般存在两种情况 一种需要替换的单词在string末尾之前,此时只需要判断当前字符是否为需要删除的字符且下个字符是否为空格。
///另一种情况是,需要替换的单词在string末尾,此时无法通过空格来判断当前是否为需要删除单词 所以只能通过位置来判断
if (s == oldVal && (beg + 1 == ori.end() || *(beg + 1) == ' '))
{
///如果单词符合需要替换的单词的话。
//删除的位置从当前位置 - (oldVal.size() - 1)的依据是,当前位置是字符所在位置,而不是空格所在位置
//所以在删除元素的时候位置都需要向后移动一位,否则将会越界
beg = ori.erase(beg - (oldVal.size() - 1), beg + 1); //首先进行删除。
beg = ori.insert(beg, newVal.cbegin(), newVal.cend()); //然后进行插入。插入newVal的全部元素
beg += newVal.size(); //移动到下一个元素上
s.clear(); //替换完成之后清空元素
}
else
{
if (*beg == ' ') //遇到空格则清空s
s.clear();
++beg;
}
}
#endif
}