快速多串替换

时间:2014-02-26 13:36:42

标签: c# regex

我需要执行多字符串替换。我有一个字符串,其中需要根据替换图更改几个部分。

所有替换必须在一个动作中完成 - 这意味着" 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");

1 个答案:

答案 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和代理来进行替换。