如何使用std :: string替换所有出现的两个字符的一个字符?

Wil*_*mKF 24 c++ replace escaping stdstring

是否有一个很好的简单的方法,以取代所有出现"/"std::string"\/"逃脱的所有斜线std::string

Unc*_*ens 34

可能最简单的方法是使用boost字符串算法库.

  boost::replace_all(myString, "/", "\\/");

  std::string result = boost::replace_all_copy(myString, "/", "\\/");
Run Code Online (Sandbox Code Playgroud)


650*_*502 6

答案是否定的......如果您的意思是标准库已经提供了单行,那么就没有"简单"的方法.然而,实现该功能并不困难.

首先,我认为可能还需要更换\\\和其他特殊字符.在这种情况下,使用replaceAllildjarn给出的实现会很烦人(你需要多次替换相同的字符串).

在我看来,有许多字符串处理的情况,其中没有什么比使用显式char *方法更好.在这个特定的情况下,可能只是使用索引是好的:

std::string escape(const std::string& s)
{
    int n = s.size(), wp = 0;
    std::vector<char> result(n*2);
    for (int i=0; i<n; i++)
    {
        if (s[i] == '/' || s[i] == '\\')
            result[wp++] = '\\';
        result[wp++] = s[i];
    }
    return std::string(&result[0], &result[wp]);
}
Run Code Online (Sandbox Code Playgroud)

基本上,这个想法是搬过来的字符串,并增加一个额外的\任何特殊字符前字符(在上面我只是处理/\,但你的想法).结果已知2*n长度最大,因此我预先分配它使整个处理O(n)(该replaceAll方法继续将字符串的其余部分向右移动,使其为O(n ^ 2)).即使像"this is a test with /slashes/ that should be /escaped/"上面这样的短字符串功能在我的电脑上也更有效率(1.3倍的速度),即使replaceAll只调用一次并处理两个特殊的字符escape.

还要注意,这个函数自然地返回一个单独的字符串而不是修改字符串(IMO是一个更好的接口),并且在时序比较中我必须为每个调用创建一个字符串,所以结果甚至转向相等,因为增加了常量时间.

上述读/写方法也可以很容易地扩展到更复杂的替换(例如>,&gt;%xx编码替换或不在可打印范围内的字符)仍然保持大字符串的良好效率(仅一次通过).