解析用户字符串,转义字符

时间:2012-01-26 17:55:26

标签: c++ string escaping

如何解析字符串并用某些内容替换\.的所有出现?但同时将所有\\替换为\(字面值)。示例:

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 个答案:

答案 0 :(得分:2)

优雅的方法:有三种状态的有限状态机:

  • 寻找'\'(迭代字符串)
  • 找到'\',下一个字符是'。'
  • 找到'\',下一个字符是'\'

要实现,您可以使用默认字符串库中的迭代器和replace方法。

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