将带有'\ b'转义字符(退格)的字符串转换为普通字符串

时间:2014-07-30 13:17:38

标签: c++ special-characters unicode-escapes

我的字符串:

std::string With_esc = "asd\b";

我想将它转换为一个简单的字符串“as”(应用退格字符并忘记它)。 有没有办法在C ++中这样做?它应该是这样的:

std::string With_esc = "asd\b";
std::string Without_esc = With_esc; //Here I should convert it
std::ofstream FWith_esc ("with");
std::ofstream FWithout_esc ("without");
FWithout_esc << Without_esc;
FWith_esc << With_esc;

击:

~ cat -e with
  asd^H
~ cat -e without
  as

不幸的是我不知道如何转换它,所以两个文件看起来完全一样。

3 个答案:

答案 0 :(得分:4)

假设您有幸使用C ++ 11(否则将此代码调整到您最喜欢的正则表达式引擎):

string With_esc = R"asd\b";
string Without_esc = regex_replace(With_esc, regex(".\\b"), "");

正如评论中所指出的,这种方法有以下局限:

  • 它只会替换一个&#34; back&#34;所以,如果你有"12\b\b",你将获得"1\b"。要处理这个问题,你需要循环,直到输入和输出(对于regex_replace())不同(或可能一个更好的正则表达式,我对它们不太好)。
  • 它不会像\b那样处理"\b123"作为字符串的开头。要处理此问题,您需要使用简单的字符串替换(使用Giobunny建议的技术)在\b()后删除regex_replace
  • 请注意,我使用的是逐字字符串(如果您的文本来自文件,但是如果您正在使用字符串文字,则需要相应地更新正则表达式,这样就可以了。) / LI>

<强>更新
正如Eric Finn所述,此表达式还将匹配多个退格,然后"a\b\b\b"将变为"\b\b",然后变为"\",这显然是错误的。正如他所建议的那样,更好的正则表达式也应该包含"[^\b]\b"的检查。

答案 1 :(得分:1)

尝试这样的事情,如果你不想使用正则表达式:

std::string convertBackspaces(std:string str)
{
    std::string::iterator iter = str.begin();
    std::string::iterator end = str.end();
    while (iter != end)
    {
        iter = std::find(iter, end, '\b');
        if (iter == end) break;
        if (iter == str.begin())
            iter = str.erase(iter);
        else
            iter = str.erase(iter-1, iter+1);
        end = str.end();
    }
    return str;
}

std::string Without_esc = convertBackspaces(With_esc);

答案 2 :(得分:0)

您可以使用空字符串替换子字符串"\b"。 它不是最快/最安全的方法,但它会起作用, 你可以关注。

Replace substring with another substring C++