2012-01-26 18 views
1

文字列を解析して、\.のすべての箇所を何かに置き換えるにはどうすればよいですか?しかし同時に\(リテラル)..例で、すべての\\を置き換える:ユーザーストリングのエスケープ文字をエスケープする

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

'' \\\\ " - >" \\ "'、 '" \\ x " - >" x "';文字ではありません。 – ulidtko

+0

私は「forループを使ったハック・ジョブと文字列を再構築する」*が最も醜い解決策になると思います。 –

答えて

2

エレガントなアプローチ:有限状態マシン三つの状態を持つ:

  • (文字列を反復処理) '\' を探して '\' と次の文字があります ''
  • は「\」が見つかりおよび次の文字を使用すると、デフォルトの文字列ライブラリ内のイテレータとreplace方法を使用することができます実装するには「\」

です。

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

+0

uhmどうすればreplaceメソッドを使用できますか?特に、コンテナから要素を削除すると、イテレータは無効になります。 – paul23

+0

挿入された文字列のサイズに最後の文字列のパターンが追加された場所から新しいイテレータを開始できます。 実際には、整数インデックスを持つ文字列の 'operator []'を使うほうがはるかに明白だと思います。 –

+0

私は 'string.replace'を使わず、元の文字列から新しい文字列を作成する方が簡単だと思います。それにもかかわらず、FSMは間違いなくここに行く方法です。 – Bklyn

関連する問題