2016-11-24 1 views
5

をインクリメントすることにより、テキストを置き換え、私はテキストを持っていると言う:各出現

Hello 
abc 
Hello 
def 
Hello 

は、私は「こんにちは」の各発生後に番号を追加する必要が

Hello1 
abc 
Hello2 
abc 
Hello3 

すなわちに変換したいですテキスト。

現在、私はこのコードを書かれている:

var xx = File.ReadAllText("D:\\test.txt"); 


var regex = new Regex("Hello", RegexOptions.IgnoreCase); 
var matches = regex.Matches(xx); 


int i = 1; 
foreach (var match in matches.Cast<Match>()) 
{ 
    string yy = match.Value; 
    xx = Replace(xx, match.Index, match.Length, match.Value + (i++)); 
} 

と使用上のReplaceメソッドは次のとおりです。

public static string Replace(string s, int index, int length, string replacement) 
{ 
    var builder = new StringBuilder(); 
    builder.Append(s.Substring(0, index)); 
    builder.Append(replacement); 
    builder.Append(s.Substring(index + length)); 
    return builder.ToString(); 
} 

現在、上記のコードは動作していないとの間でテキストを置き換えています。

あなたはそれを修正するのに手伝ってもらえますか? Helloはここで、より複雑なパターンのためだけのプレースホルダであると仮定すると、

+0

Wiktor第の答えがある参照してください。最高のソリューション。あなたの交換ロジックが動作していない理由は、xxが変更されたため、foreachの各繰り返しで一致のインデックス値が古くなってしまうことです。 Replaceメソッドを記述する必要がある場合は、再帰的であるように見えます。 –

答えて

9

は簡単な修正です:あなたは、変数を使用することができRegex.Replace内の一致エバリュエータを使用します。

var s = "Hello\nabc\nHello\ndef\nHello"; 
var i = 0; 
var result = Regex.Replace(
    s, "Hello", m => string.Format("{0}{1}",m.Value,++i), RegexOptions.IgnoreCase); 
Console.WriteLine(result); 

C# demo

+0

私は質問があります。特に 'string.Format()'を使わない特別な理由はありますか? – Sid

+0

「すぐに」とはどういう意味ですか? –

+0

私は彼が3人しか必要としなかったので、それは愚かでした。彼はその場合でも 'string.Format'を必要としないからです。 – Sid

関連する問題