0

次のようなリストがあります:

  • ジョージ fg
  • ミシェル・フグ
  • ヤセルフグ

fg、fgu、および fguh を「fguhCool」に置き換えたいと思います。すでに次のようなことを試しました。

            foreach (var ignore in NameToPoulate)
        {
            tempo = ignore.Replace("fg", "fguhCool");
            NameToPoulate_t.Add(tempo);
        }

しかし、「fgu」は「fguhCoolu」になり、「fguh」は「fguhCooluh」になり、より良いアイデアはありますか?

ご協力いただきありがとうございます。

4

3 に答える 3

3

これは宿題であり、仕事をするコードではなく、特定のアルゴリズムについてテストされていると思います。

これはおそらくあなたの先生が念頭に置いていることです:

学生は、コードが最初に「fguh」をチェックし、次に「fgu」、「fg」をチェックする必要があることに気付くでしょう。お気づきのように、「fg」を置き換えると「fguh」が破壊されるため、順序は重要です。

これは、一部の学生によって、if-else 条件を含むループとして実装されます。既に置き換えられた「fguhCool」内にある「fg」を置き換えないようにします。

しかし、"fg" と "fgu" が両方とも同じ文字列内にあると、アルゴリズムが機能しなくなることがわかります。「fgu」の存在を許可して、文字列の別の部分で「fg」をチェックできないようにすることはできません。

先生が探している答えは、まず「fguh」、「fgu」、「fg」を (この順序で) 見つけて、「fg」を含まない中間文字列に置き換える必要があるということでしょう。その後、その中間文字列を検索して、「fguhCool」に置き換えることができます。

于 2012-04-27T07:05:49.120 に答える
0

正規表現を使用できます。

Regex.Replace(@"\bfg\b", "fguhCool");

\b、いわゆる単語境界に一致します。これは、単語の最初または最後に一致することを意味します(大まかに言えば、この目的には十分です)。

于 2012-04-27T06:46:16.713 に答える
0

正規表現を使用します。

Regex.Replace("fg(uh?)?", "fguhCool");

別の方法は、最初に長い単語を短い単語に置き換え、次に短い単語を最終値に置き換えることです(「fg」、「fgu」、「fguh」のすべての単語が同じ値「fguhCool」にマップされると想定しています"、 右?)

tempo = ignore
    .Replace("fguh", "fg")
    .Replace("fgu", "fg")
    .Replace("fg", "fguhCool");

Obs.:それはそれらの単語が文字列のどこにでも現れることができると仮定します。単語全体が心配な場合(つまり、それらの単語がより大きな単語の部分文字列ではない場合)、@ Joeyの回答を参照してください(この場合、単純な置換では機能しません。正規表現が実際に最適なオプションです)。

于 2012-04-27T06:47:07.430 に答える