我的字符串:
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
不幸的是我不知道如何转换它,所以两个文件看起来完全一样。
答案 0 :(得分:4)
假设您有幸使用C ++ 11(否则将此代码调整到您最喜欢的正则表达式引擎):
string With_esc = R"asd\b";
string Without_esc = regex_replace(With_esc, regex(".\\b"), "");
正如评论中所指出的,这种方法有以下局限:
"12\b\b"
,你将获得"1\b"
。要处理这个问题,你需要循环,直到输入和输出(对于regex_replace()
)不同(或可能一个更好的正则表达式,我对它们不太好)。\b
那样处理"\b123"
作为字符串的开头。要处理此问题,您需要使用简单的字符串替换(使用Giobunny建议的技术)在\b
()后删除regex_replace
。 <强>更新强>
正如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"
。
它不是最快/最安全的方法,但它会起作用,
你可以关注。