2015-08-14 3 views
3

У меня есть следующая строка:Как заменить несколько вхождений за один проход?

abc 
def 
abc 
xyz 
pop 
mmm 
091 
abc 

Мне нужно, чтобы заменить все вхождения abc с теми из массива ["123", "456", "789"] поэтому окончательная строка будет выглядеть следующим образом:

123 
def 
456 
xyz 
pop 
mmm 
091 
789 

Я хотел бы сделать он без итерации, с единственным выражением. Как мне это сделать?

+0

Таким образом, п-й экземпляр 'abc' должен быть заменен на п-м индексом из массива? – MikeTheLiar

+0

Да, точно !!! – Pablo

+0

Почему вы хотите сделать это без явной итерации? (Обратите внимание, что это невозможно сделать без какой-либо итерации - в какой-то момент, то, что вы делаете или называете, будет делать итерацию для ее решения.) –

ответ

5

Вот "одно выражение версии":

редактировать: Делегат вместо лямбда на 3,5

string[] replaces = {"123","456","789"}; 
Regex regEx = new Regex("abc"); 
int index = 0; 
string result = regEx.Replace(input, delegate(Match match) { return replaces[index++];}); 

Попробуй here

+0

не «Заменить» использовать foreach внутри? :) – Backs

+0

@Backs Это внутренняя петля, но насколько я знаю, нет возможности выполнить эту задачу без цикла ... – Gnqz

+1

Im довольно уверен, что op означает избегать любого кода цикла, написанного им самим. . for, foreach, Linq ... – CSharpie

3

сделать это без итерации, только с однократное выражение

В этом примере используется статический Regex.Replace Method (String, String, MatchEvaluator), который использует MatchEvaluator Delegate (System.Text.RegularExpressions), который заменит значения совпадают с аа очереди и возвращает строку в результате:

var data = 
@"abc 
def 
abc 
xyz 
pop 
mmm 
091 
abc"; 

var replacements = new Queue<string>(new[] {"123", "456", "789"}); 

string result = Regex.Replace(data, "(abc)", replacements.Dequeue()); 

Результат

123 
def 
456 
xyz 
pop 
mmm 
091 
789 

. Net 3.5 Делегат

, тогда как я ограничен 3.5.

Regex.Replace(data, "(abc)", delegate(Match match) { return replacements.Dequeue(); }) 
+0

@Pablo Обновлено для .Net 3.5. – OmegaMan

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