2016-11-24 5 views
5

У меня есть текст сказать:Заменить текст приращением каждый вхождение

Hello 
abc 
Hello 
def 
Hello 

Я хочу, чтобы преобразовать его в

Hello1 
abc 
Hello2 
abc 
Hello3 

т.е. мне нужно добавить номер после каждого появления «Hello» текст.

В настоящее время я написал этот код:

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

В настоящее время выше код не работает, и замена текста между ними.

Помогите мне исправить это?

+0

ответ Wiktor является лучшее решение. Причина, по которой ваша логика замены не работает, заключается в том, что на каждой итерации вашего foreach значения индекса совпадений устарели, потому что xx изменился. Если вы должны написать метод Replace, похоже, он был бы рекурсивным. –

ответ

9

Предполагая, что Hello просто заполнитель для более сложного рисунка, вот простое решение проблемы: использовать спички оценщик внутри 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, это было глупо, потому что в этом случае ему даже не нужна строка. – Sid

Смежные вопросы