2012-01-26 64 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