2012-01-26 35 views
1

如何解析字符串并用\.取代所有出现的东西?然而,在同一时间用\(文字)..实施例替换所有\\解析用户字符串,转义字符

hello \. world =>hello "." world
hello \\. world =>hello \. world
hello \\\. world =>hello \"." world

的第一反应是使用std ::如下所示:

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

您应该更换字符串,例如: ''\\\\“ - >”\\“','”\\ x“ - >”x“';不是字符。 – ulidtko

+0

我认为*“带for循环和重建字符串的黑客作业”*将是最不可思议的解决方案。 –

回答

2

优雅的方法:

  • 寻找 '\'(通过字符串遍历)
  • 发现 '\' 和下一个字符是:一个有限状态机三个州 ''
  • 发现“\”和下一个字符是“\”

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

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

+0

uhm如何使用替换方法?特别是因为如果从容器中删除元素,迭代器会失效。 – paul23

+0

您可以从最后一个字符串中找到的模式加上插入的字符串的大小开始新的迭代器。 实际上,我认为只要使用字符串的'operator []',就可以使用整数索引。 –

+0

我认为不使用'string.replace'会更简单,而是从原始字符逐个字符地构建一个新字符串。无论如何,FSM绝对是这里的方式。 – Bklyn