C++アナログ標準ライブラリ関数replaceによる単語置換
12372 ワード
自分で作成した単語置換関数は,主に標準ライブラリ関数replaceをシミュレートする方法である.欠点は、一致する文字を検出して置換するのではなく、単語のみを置換することであり、HiImLissyをlissyに置換する必要がある場合は実現できません.文字マッチングを置換する必要がある場合は、標準ライブラリ関数の使用を推奨します.
主にreplaceを行うために2つの方法を用いた.コードには注釈と解釈が与えられている.コードは次のとおりです.
主にreplaceを行うために2つの方法を用いた.コードには注釈と解釈が与えられている.コードは次のとおりです.
/// 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
}