c# - 快速多字符串替换

标签 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");

最佳答案

您可以将所有这些替换为

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

关键是利用 string.Join方法而不是自己实现,并利用这个 Regex.Replace overload和代表进行替换。

关于c# - 快速多字符串替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22043083/

相关文章:

c# - .NET 中的网络文件复制

mysql - MySQL 的 SED 等效项

javascript - 正则表达式匹配特定字符串且不超过两个斜杠

mysql - 为什么正则表达式的点元字符在 mysql 中不起作用?

c# - 获取在主 UI 线程上发生的 filesystemwatcher 事件

c# - MVC 5使用jquery添加动态字段到表单并将其保存到模型

c# - 从对象列表创建逗号分隔列表

c# - 如何使用 XML 存储/加载 IntrinsicCameraParameters

r - 使用正则表达式查找字符串中的字符 '!' 和 '?'

javascript - 带有正则表达式的 JavaScript 中的第三个嵌套引用级别