2016-11-24 25 views
5

Tôi có một văn bản nói:Thay thế một văn bản bằng cách tăng mỗi điều xảy ra

Hello 
abc 
Hello 
def 
Hello 

Tôi muốn chuyển nó sang

Hello1 
abc 
Hello2 
abc 
Hello3 

tức là tôi cần phải thêm một số sau mỗi lần xảy ra "Hello" bản văn.

Hiện nay tôi đã viết mã này:

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

và Replace phương pháp trên sử dụng là:

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

Hiện nay các mã trên không hoạt động và đang dần thay thế các văn bản ở giữa.

Bạn có thể giúp tôi khắc phục điều đó không?

+0

Wiktor của câu trả lời là giải pháp tốt nhất. Lý do logic thay thế của bạn không hoạt động mặc dù là trên mỗi lần lặp lại của bạn foreach các giá trị chỉ số của các trận đấu đi ra khỏi ngày vì xx đã thay đổi. Nếu bạn phải viết một phương pháp thay thế nó có vẻ như nó sẽ được đệ quy. –

Trả lời

9

Giả sử Hello chỉ là một giữ chỗ cho một mô hình phức tạp hơn, đây là một sửa chữa đơn giản: sử dụng một đánh giá trận đấu bên Regex.Replace nơi bạn có thể sử dụng các biến:

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

Xem C# demo

+0

Tôi có một câu hỏi, Có lý do cụ thể nào không sử dụng 'string.Format()' ngay lập tức không? – Sid

+0

Bạn có ý nghĩa gì bởi "ngay lập tức"? –

+0

Tệ của tôi tôi nghĩ anh ta chỉ cần 3, đó là ngớ ngẩn bởi vì anh ta thậm chí không cần 'string.Format' trong trường hợp đó. – Sid

Các vấn đề liên quan