Парсинг пользовательской строки, escape-символов
Как я могу разобрать строку и заменить все вхождения \.
с чем-то? Но в то же время заменить все \\
с \
(буквальный).. Примеры:
hello \. world
=> hello "." world
hello \\. world
=> hello \. world
hello \\\. world
=> hello \"." world
Первой реакцией было использование std::replace_if, как показано ниже:
bool escape(false);
std::replace_if(str.begin(), str.end(), [&] (char c) {
if (c == '\\') {
escape = !escape;
} else if (escape && c == '.') {
return true;
}
return false;
},"\".\"");
Однако это просто меняется \.
от \"."
последовательности. Также это не будет работать для \\
части в пяльцах.
Есть ли элегантный подход к этому? Прежде чем я начну заниматься хакерской работой с циклом for и перестроением строки?
1 ответ
Элегантный подход: конечный автомат с тремя состояниями:
- ищем '\' (перебирая строку)
- найдено '\', а следующий символ - '.'
- найдено '\' и следующий символ '\'
Для реализации вы можете использовать итераторы в библиотеке строк по умолчанию и replace
метод.