Парсинг пользовательской строки, 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 метод.

http://www.cplusplus.com/reference/string/string/replace/

Другие вопросы по тегам