Моя строка:
std::string With_esc = "asd\b";
Я хочу, чтобы преобразовать его в простую строку «как» (применить символ возврата и забыть).
Есть ли способ сделать это в 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;
Bash:
~ cat -e with
asd^H
~ cat -e without
as
К сожалению, я не знаю, как конвертировать его, поэтому оба файла выглядят одинаково.
Предполагая, что вам повезло использовать 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
().ОБНОВИТЬ
Как отмечено Эрик Финн это выражение также будет соответствовать нескольким возвратам "a\b\b\b"
станет "\b\b"
а потом "\"
очевидно, что это неправильно. Как он предположил, лучшее регулярное выражение должно включать проверку на "[^\b]\b"
тоже.
Попробуйте что-то вроде этого, если вы не хотите использовать регулярное выражение:
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);
Вы можете заменить подстроку "\b"
с пустой строкой.
Это не самый быстрый / безопасный метод, но он будет работать,
Вы можете следовать.