2016-11-24 1 views
5

ich einen Text haben sagen:Ersetzen Sie einen Text, indem jedes Auftreten Inkrementieren

Hello 
abc 
Hello 
def 
Hello 

ich es

Hello1 
abc 
Hello2 
abc 
Hello3 

dh umwandeln möchte ich brauche eine Nummer nach jedem Auftreten von „Hallo“ anhängen Text.

Zur Zeit habe ich geschrieben diesen Code:

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++)); 
} 

und die Methode Ersetzen oben verwendet wird, ist:

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(); 
} 

Zur Zeit der obige Code funktioniert nicht und wird den Text dazwischen zu ersetzen.

Können Sie mir helfen, das zu beheben?

+0

Wiktor Antwort ist die beste Lösung. Der Grund dafür, dass Ihre Ersetzungslogik nicht funktioniert, besteht darin, dass die Indexwerte der Übereinstimmungen bei jeder Iteration der Übereinstimmungen veraltet sind, weil sich xx geändert hat. Wenn Sie eine Replace-Methode schreiben müssen, scheint sie rekursiv zu sein. –

Antwort

9

Hello Unter der Annahme, ist nur ein Platzhalter für ein komplexeres Muster, hier ist eine einfache Lösung: ein Spiel Auswerter innerhalb Regex.Replace verwenden, in denen Sie Variablen verwenden:

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); 

Siehe C# demo

+0

Ich habe eine Frage, gibt es einen bestimmten Grund nicht 'string.Format()' sofort verwenden? – Sid

+0

Was meinst du mit "sofort"? –

+0

Mein schlechtes Ich habe gesagt, er brauchte nur 3, das war albern, weil er in diesem Fall gar nicht 'string.Format' braucht. – Sid

Verwandte Themen