2012-03-07 8 views
6

文字列の一部をC#で置き換える必要があります。 私はこれを実現する方法について似たような質問が1つしか見つかりませんでしたが、hereがPHPでした。2つ以上の文字列を互いに置き換えるにはどうすればよいですか?

私の状況は辞書のように交換するペアを保持して、[文字列、文字列]が含ま:

  • 犬、猫
  • 猫、マウス、
  • マウス、猛禽

をと私は以下の値を持つ文字列を持っています:

"My dog ate a cat which once ate a mouse got eaten by a raptor" 

私はこれを取得する機能が必要になります。

"My cat ate a mouse which once ate a raptor got eaten by a raptor" 

私は辞書を列挙し、順序でstring.Replaceを呼び出す場合、私はこれを取得:

"My raptor ate a raptor which once ate a raptor got eaten by a raptor" 

これは前に頼まれていない場合それは奇妙です、(それは一般的な知識ですか?)しかし、私は何も見つけることができませんでした。だからそれがあれば、私はそれを逃したと申し訳ありません。

+0

汚れたやり方は、中間テキストを使用することです。 「犬」を「1」に、「猫」を「2」に変換し、次に「1」と「2」をあなたが望むものに変換する第2のパスを行います。 '1'と '2'(おそらくGUID)よりもユニークなものを使用してください。私が言ったように、その汚い、と私は良い方法があると確信しています。 – xbonez

+0

辞書( "foo": "1"、 "bar": "2"、 "foobar": "3")に "foo bar foobarbar"と入力したいとしますか? – Dogbert

+0

@Dogbert "1 2 32" –

答えて

9

の処理が一度しか行われないようにする必要があります。一度私は正解は実際には '正規表現を使用する'と思う!ここではいくつかのコードがあります:

var replacements = new Dictionary<string, string> 
         { 
          { "do|g", "cat" }, 
          { "ca^t", "mouse" }, 
          { "mo$$use", "raptor" } 
         }; 

var source = "My do|g ate a ca^t which once ate a mo$$use"; 

var regexPattern = 
    "(" + 
    string.Join("|", replacements.Keys.Select(Regex.Escape)) + 
    ")"; 

var regex = new Regex(regexPattern); 

var result = regex.Replace(source, match => replacements[match.Value]); 

// Now result == "My cat ate a mouse which once ate a raptor" 

私たちがここに建てるパターンが(dog|cat|mouse)のように見えます。この代替構造(|)の各部分はRegex.Escapeに渡されるので、キー内の正規表現に意味のある文字(|^など)は問題にはなりません。一致するものが見つかると、一致するテキストは辞書内の対応する値に置き換えられます。文字列は1回だけスキャンされるので、反復されたstring.Replaceの問題と同じように繰り返される一致はありません。

+0

私のソリューションよりも優れており、よりエレガントです。私の+1。 –

+1

あなたの答えをありがとう。本当にエレガントですが、私は正規表現についての経験がないので、私は尋ねる必要があります:もし私が犬を犬に置き換えようとしたらどうでしょうか?置きたい部分(バックスラッシュや "|"文字など)を中和し、 '(dog | ca | t | mouse)'のようなものを作成しないようにする方法はありますか? –

+0

@ d4wn優れた考察。必要に応じて 'Regex.Escape'を使って編集しました。 – AakashM

1

あなたが望むのは、すべての文字列置換を同時に実行することです。同じトークンで複数の置換文字が得られないようにするのは正しいでしょうか?あなたはいつも猫/マウスの前にマウス/猛禽類を交換ますので、特定の順序で辞書を超える

  • 反復:

    は、私は2つのアプローチ、どちらも特にエレガントなと考えることができます。

  • catを 'mouse'に置き換える代わりに、 '$ mouse $'またはそれに類似するマーカーに置き換えてください。これにより、 '$ mouse $'は 'raptor'(実際には '$ raptor $')に置き換えられません。その後、スイッチを終了したら、すべての '$'記号を削除することができます。
+0

ポイント1の場合、質問の反対の順序で、マウス - >ラプター、次にcat - >マウス、そしてdog - > catの順番で置き換える必要があります。 – TheLukeMcCarthy

+0

このサンプルではyesです。より一般的な解決策として、ある種の有向非循環グラフを構築して確実にする必要があります。 –

+0

それは正しいです私はちょうどd4wnが以前にはうまくいかなかった理由を見ることができるように、具体的な例を挙げたいと思っていました。 – TheLukeMcCarthy

関連する問題