Преобразовать строку с escape-символом \ b (backspace) в обычную строку

Моя строка:

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

К сожалению, я не знаю, как конвертировать его, поэтому оба файла выглядят одинаково.

1

Решение

Предполагая, что вам повезло использовать 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" тоже.

4

Другие решения

Попробуйте что-то вроде этого, если вы не хотите использовать регулярное выражение:

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);
1

Вы можете заменить подстроку "\b" с пустой строкой.
Это не самый быстрый / безопасный метод, но он будет работать,
Вы можете следовать.

Заменить подстроку другой подстрокой C ++

0
По вопросам рекламы [email protected]