我需要执行多字符串替换。我有一个字符串,其中需要根据替换图更改几个部分。
所有替换必须在一个动作中完成 - 这意味着" 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");
答案 0 :(得分: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和代理来进行替换。