我的字符串:

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

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

最佳答案

假设您有幸使用C++ 11(否则请将此代码修改为您喜欢的regex引擎):

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

正如评论中指出的那样,此方法具有以下局限性:
  • 它只会替换一个“back”,因此,如果您有"12\b\b",则会得到"1\b"。为了解决这个问题,您需要循环直到输入和输出(对于regex_replace())有所不同(或者也许是更好的正则表达式,我对它们不太满意)。
  • 它不会像\b中那样将"\b123"作为字符串的开头来处理。要解决此问题,您需要简单的字符串替换(使用Giobunny建议的技术),以便在\b()之后删除regex_replace
  • 注意,这里我使用逐字字符串(例如,如果文本来自文件,则可以,但是如果您使用的是字符串文字,则需要相应地更新正则表达式)。

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

    关于c++ - 将带有 '\b'转义符(退格)的字符串转换为普通字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25037848/

    10-11 23:14
    查看更多