Ответ - нет ... «простого» пути не существует, если вы имеете в виду однострочник, уже предоставленный стандартной библиотекой. Однако реализовать эту функцию несложно.
Прежде всего, я думаю, что, вероятно, вам также потребуется заменить \
на \\
и другие специальные символы. В этом случае использование replaceAll
, данное ildjarn, будет раздражать (вам нужно будет заменить одну и ту же строку несколько раз).
По моему мнению, существует много случаев обработки строк, когда ничто не сравнится с использованием явного подхода char *
. Однако в данном конкретном случае, вероятно, достаточно просто использовать индекс:
std::string escape(const std::string& s)
{
int n = s.size(), wp = 0;
std::vector<char> result(n*2);
for (int i=0; i<n; i++)
{
if (s[i] == '/' || s[i] == '\\')
result[wp++] = '\\';
result[wp++] = s[i];
}
return std::string(&result[0], &result[wp]);
}
По сути, идея состоит в том, чтобы перемещаться по строке и добавлять дополнительный символ \
перед любым специальным символом (в приведенном выше примере я обрабатывал /
и \
, но вы поняли идею).
Результат, как известно, имеет максимальную длину 2*n
, поэтому я предварительно выделяю его, делая всю обработку O (n) (вместо этого подход replaceAll
продолжает перемещать оставшуюся часть строки вправо, делая ее O (n ^) 2)).
Даже для коротких строк, таких как "this is a test with /slashes/ that should be /escaped/"
, вышеупомянутая функция на моем ПК более эффективна (со скоростью 1,3x), даже если вызывать replaceAll
только один раз и обрабатывать вместо этого два специальных символа в escape
.
Обратите внимание, что эта функция естественным образом возвращает отдельную строку вместо изменения строки на месте (IMO - лучший интерфейс), и при сравнении времени мне пришлось создавать строку для каждого вызова, чтобы результаты даже сдвигались в сторону равенства из-за это добавило постоянное время.
Приведенный выше подход чтения / записи также может быть легко расширен на более сложные замены (например, замена >
на >
или символы, не находящиеся в области печати с кодировкой %xx
), сохраняя при этом хорошую эффективность для больших строк (просто один проход).