1

我的字符串:

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

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

4

3 回答 3

4

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

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

正如评论中指出的那样,这种方法具有以下局限性:

  • 它只会替换一个“背部”,所以如果你有"12\b\b",你会得到"1\b". 要处理这个问题,你需要循环直到输入和输出(for regex_replace())不同(或者可能是一个更好的正则表达式,我对它们不太好)。
  • 它不会\b像 in 那样作为字符串的开头处理"\b123"。要处理这个问题,您需要一个简单的字符串替换(使用Giobunny\b建议的技术)在 ()之后删除regex_replace
  • 请注意,这里我使用的是逐字字符串(例如,如果您的文本来自文件,但如果您使用的是字符串文字,则需要相应地更新正则表达式)。

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

于 2014-07-30T13:22:29.650 回答
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);
于 2014-08-01T07:36:34.423 回答
0

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

用另一个子字符串 C++ 替换子字符串

于 2014-07-30T13:21:34.717 回答