парсинг пользовательской строки, escape-символов - PullRequest
1 голос
/ 26 января 2012

Как я могу разобрать строку и заменить все вхождения \. чем-то?В то же время замените все \\ на \ (буквально). Примеры:

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 Ответ

2 голосов
/ 26 января 2012

Элегантный подход: конечный автомат с тремя состояниями:

  • ищет '\' (перебирает строку)
  • найден '\' и следующий символ - '.'
  • найдено '\' и следующий символ '\'

Для реализации вы можете использовать итераторы в библиотеке строк по умолчанию и метод replace.

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

...