Быстрая многострочная замена - программирование
Подтвердить что ты не робот

Быстрая многострочная замена

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

Вся замена должна выполняться в одном действии - это означает, что если "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");
4b9b3361

Ответ 1

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

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

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