Вы можете сделать это довольно легко, используя библиотеку алгоритма строки ускорения.Например:
#include <string>
#include <iostream>
#include <boost/algorithm/string.hpp>
void escape(std::string& str)
{
boost::replace_all(str, "\\\\", "\\");
boost::replace_all(str, "\\t", "\t");
boost::replace_all(str, "\\n", "\n");
// ... add others here ...
}
int main()
{
std::string str = "This\\tis\\n \\\\a test\\n123";
std::cout << str << std::endl << std::endl;
escape(str);
std::cout << str << std::endl;
return 0;
}
Это, безусловно, не самый эффективный способ сделать это (поскольку он повторяет строку несколько раз), но он компактен и прост для понимания.
Обновление : Как указал ybungalobill, эта реализация будет неправильной, всякий раз, когда замещающая строка создает последовательность символов, которую ищет более поздняя замена или когда замена удаляет / изменяет последовательность символов, которую следует заменить.
Примером первого случая является "\\\\n"
-> "\\n"
-> "\n"
.Когда вы ставите замену "\\\\"
-> "\\"
последней (что на первый взгляд кажется решением), вы получаете пример для последнего случая "\\\\n"
-> "\\\n"
.Очевидно, что не существует простого решения этой проблемы, что делает эту технику выполнимой только для очень простых escape-последовательностей.
Если вам нужно общее (и более эффективное) решение, вы должны реализовать конечный автомат, который выполняет итерацию строки, как предложено давкой.