2016-09-20 5 views
1

私はこのコードを持っている:文字列をC#で動的値に置き換える方法は?

string a = "**MustbeReplaced**asdgasfsff**MustbeReplaced**asdfafasfsa"; 
//MustbeReplaced should be Replaced1, Replaced2, and so on 
a = a.Replace("MustbeReplaced", "Replaced"); 

文字列置換があるたびに、私は動的な値に置き換えるしたいと思います。例えば、上記の文字列の出力は次のようになります。

"**Replaced1**asdgasfsff**Replaced2**asdfafasfsa" 

私は約String.Replaceを知っているが、私の知る限り、それだけで静的String交換のためです。

これを行う方法はありますか?

+0

は 'IndexOf'は、' 'IndexOf'が戻るまで繰り返し、次の発生前の位置+交換用の長さで始まるを見つけ、交換すると最初に出現-1' [の –

+0

可能な重複私は\ *最初に置き換えるにはどうすればよいの検索します.NETの文字列のインスタンス\ *?](http://stackoverflow.com/questions/141045/how-do-i-replace-the-first-instance-of-a-string-in-net) – Esko

+1

ブレイクseperatorとしてキー "MustbeReplaced"を使用して文字列配列に文字列を変換します。次に、配列のループを実行します。 – Knu8

答えて

4

あなたはRegexクラスを使用し、各試合に1回呼び出されるデリゲートを提供することができます:ここでは

はさらに簡単な例です。一致したテキストを置き換える文字列を返す必要があります。

あなたは単にあなたのカウンタを保持する変数を宣言する必要があります。これを実行した後

string a = "**MustbeReplaced**asdgasfsff**MustbeReplaced**asdfafasfsa"; 
int replacementIndex = 0; 
string b = Regex.Replace(a, "MustbeReplaced", match => 
{ 
    replacementIndex++; 
    return $"Replaced{replacementIndex}"; 
}); 

bは、この含まれています:あなたが今Regexを使用しているので:

**Replaced1**asdgasfsff**Replaced2**asdfafasfsa 

注意をクラスでは、Regexが単純な文字毎のパターンマッチングからパターンを補うために使用するすべての特殊文字を認識してください。アスタミックス、疑問符、括弧などの記号を含むテキストを置き換える場合は、それらをエスケープする必要があります。

は幸いにも、我々は単に私たちのためにそれを行うにはRegexクラスを頼むことができます。

string a = "**Mustbe?Replaced**asdgasfsff**Mustbe?Replaced**asdfafasfsa"; 
int replacementIndex = 0; 
string b = Regex.Replace(a, Regex.Escape("Mustbe?Replaced"), match => 
{ 
    replacementIndex++; 
    return $"Replaced{replacementIndex}"; 
}); 
2

Regex.Replace(String, MatchEvaluator)オーバーロードを使用してください。 corresponding MSDN pageには、要件にほぼ一致するサンプルが含まれています。

var input = "MustBeReplaced A MustBeReplaced B"; 

int i = 1; 
MatchEvaluator evaluator = (m) => "Replaced " + (i++); 

// yields Replaced 1 A Replaced 2 B 
var result = Regex.Replace(input, "MustBeReplaced", evaluator); 
+0

@ LasseV.Karlsen:ああ、もちろん、ありがとう。エスケープに言及してあなたに+1してください! – Heinzi

1

あなたは既に示した正規表現を使用するか、またはこれをより効率的にあまり読み、純粋な文字列メソッドのアプローチ:

string a = "**MustbeReplaced**asdgasfsff**MustbeReplaced**asdfafasfsa"; 
int matchCount = 0, index = 0; 
while ((index = a.IndexOf("MustbeReplaced", index, StringComparison.Ordinal)) >= 0) 
{ 
    a = a.Remove(index, "MustbeReplaced".Length).Insert(index, "Replaced" + ++matchCount); 
} 
+0

これはなぜより効率的ですか? –

+0

@ LasseV.Karlsen:文字列メソッドが正規表現よりも効率的であるため –

+0

これは 'StringBuilder'を使うとはるかに良いでしょうか? –

0

は次のように行うことができる:

 string source = "**MustbeReplaced**asdgasfsff**MustbeReplaced**asdfafasfsa"; 
     int count = 0; 
     var result = Regex.Replace(source, "MustbeReplaced", m => "Replaced" + (++count)); 
0

は、正規表現を避けるためにしたいですか?より多くのパフォーマンスが必要ですか?このコードを使用してください。 このコードは一度にStringBuilderのみを使用します。

public static string ReplaceWithNumberPrefix(this string source, string oldString, string newString, int numberPrefixStart) 
    { 
     var oldStringLength = oldString.Length; 

     var indexes = new List<int>(); 
     var p = source.IndexOf(oldString);      
     if (p >= 0) 
      do 
      { 
       indexes.Add(p); 
       p = source.IndexOf(oldString, p + 1);      
      } while (p >= 0); 

     var builder = new System.Text.StringBuilder(source); 
     var trailingDifference = 0; 
     for (int i = 0; i < indexes.Count; i++) 
     { 
      var replacement = string.Concat(newString, numberPrefixStart); 
      var startIndex = indexes[i] + trailingDifference; 
      builder.Replace(oldString, replacement, startIndex, oldStringLength); 

      numberPrefixStart++; 
      trailingDifference = trailingDifference + replacement.Length - oldStringLength; 
     } 

     return builder.ToString(); 
    } 
関連する問題