2014-02-26 11 views
10

Мне нужно выполнить замену нескольких строк. У меня есть строка, в которой необходимо изменить несколько частей в соответствии с картой замещения.Быстрая замена нескольких строк

Все замены должны быть сделаны в одном действии - это означает, что если «a» следует заменить «b», а также «b» должен быть заменен на «c» и входная строка «abc», то результат будет "bcc" У меня есть решение, основанное на регулярном выражении, а затем заменяя все совпадения. Я написал это некоторое время назад, теперь я рефакторинг кода и не очень доволен этим. Лучше ли (быстрее, проще) растворение?

Это то, что у меня есть:

public static string Replace(string s, Dictionary<string, string> substitutions) 
{ 
    string pattern = ""; 
    int i = 0; 
    foreach (string ch in substitutions.Keys) 
    { 
     if (i == 0) 
      pattern += "(" + Regex.Escape(ch) + ")"; 
     else 
      pattern += "|(" + Regex.Escape(ch) + ")"; 
     i++; 
    } 

    var r = new Regex(pattern); 
    var parts = r.Split(s); 

    string ret = ""; 
    foreach (string part in parts) 
    { 
     if (part.Length == 1 && substitutions.ContainsKey(part[0].ToString())) 
     { 
      ret += substitutions[part[0].ToString()]; 
     } 
     else 
     { 
      ret += part; 
     } 
     } 
     return ret; 
} 

И тестовый случай:

var test = "test aabbcc"; 
var output = Replace(test, new Dictionary<string, string>{{"a","b"},{"b","y"}}); 
Assert.That(output=="test bbyycc"); 
+2

Никогда не используйте «+» на строках, если не нужно добавить несколько строк (менее 4 строк) ... вместо этого используйте StringBuilder! – Olivier

ответ

9

Вы можете заменить все это с

var r = new Regex(string.Join("|", substitutions.Keys.Select(k => "(" + k + ")")));  
return r.Replace(s, m => substitutions[m.Value]); 

Ключевые вещи делают использование string.Join а не реализовать его самостоятельно, и используя это Regex.Replace overload и делегатам сделать замену.

+0

Ницца, спасибо. Мне просто интересно, есть ли совершенно другой подход. Ваш использует linq и Regex.Replace, но основная идея остается. – Iale

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