Мне нужно выполнить замену нескольких строк. У меня есть строка, в которой необходимо изменить несколько частей в соответствии с картой замещения.
Вся замена должна выполняться в одном действии - это означает, что если "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");