Regex replace - как заменить один и тот же шаблон в нескольких местах разными строками? - PullRequest
6 голосов
/ 18 января 2010

У меня особенная проблема ..!

У меня есть строка с некоторым постоянным значением в нескольких шагах. Например, рассмотрим следующий укус.

string tmpStr = "Hello _tmp_ how is _tmp_ this possible _tmp_ in C#...?"

Теперь я хочу заменить каждый из tmp в строке значениями, которые хранятся в массиве, первый tmp содержит массив [0], второй tmp содержит массив [1] и так далее ...

Есть идеи, как этого достичь ...? Я использую C # 2.0

Ответы [ 4 ]

4 голосов
/ 18 января 2010

Как насчет этого:

string input = "Hello _tmp_ how is _tmp_ this possible _tmp_ in C#...?";
string[] array = { "value1", "value2", "value3" };

Regex rx = new Regex(@"\b_tmp_\b");

if (rx.Matches(input).Count <= array.Length)
{
    int index = 0;
    string result = rx.Replace(input, m => array[index++]);
    Console.WriteLine(result);
}

Необходимо убедиться, что количество найденных совпадений никогда не превышает длину массива, как показано выше.

РЕДАКТИРОВАТЬ: в ответ на комментарий, это может легко работать с C # 2.0, заменив лямбду следующим:

string result = rx.Replace(input, delegate(Match m) { return array[index++]; });
2 голосов
/ 18 января 2010

вы можете использовать MatchEvaluator (функция, которая вызывается для выполнения каждой замены), некоторые примеры здесь:

http://msdn.microsoft.com/en-us/library/aa332127%28VS.71%29.aspx

1 голос
/ 18 января 2010

Я думаю, что первое решение Ахмада Магида - это то, что нужно, потому что массив [index ++] оценивается только один раз при передаче в метод rx.Replace.

Я также скомпилировал его, чтобы проверить, правильно ли я его понимаю, и достаточно уверенно, что он выдает следующий вывод:

Привет value1, как это value1 это возможное значение1 в C # ...?

Изменилось ли поведение в более поздних версиях фреймворка? или я ошибаюсь, думая, что ожидаемый результат должен быть:

Привет value1, как это value2 это возможное значение 3 в C # ...?

1 голос
/ 18 января 2010

предложение, вы можете использовать string.Split (), чтобы разделить на "tmp". затем выполните итерацию списка разделенных элементов и распечатайте их + значения массива, например, только идея псевдокода

string[] myarray = new string[] { 'val1', 'val2' };
string s = "Hello _tmp_ how is _tmp_ this possible _tmp_ in C#";
string[] items = s.Split("tmp");
for (int i = 0; i < items.Length; i++)
{
    Console.WriteLine(parts[i] + myarray[i] ) ;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...