替代多个String.Replaces

时间:2012-08-17 14:04:39

标签: c# string replace

我的代码连续多次使用String.Replace

mystring = mystring.Replace("somestring", variable1);
mystring = mystring.Replace("somestring2", variable2);
mystring = mystring.Replace("somestring3", variable1);

我怀疑有更好更快的方法。你会建议什么?

8 个答案:

答案 0 :(得分:62)

对于'简单'替代方案,只需使用StringBuilder ....

StringBuilder sb = new StringBuilder("11223344");

string myString =
    sb
      .Replace("1", string.Empty)
      .Replace("2", string.Empty)
      .Replace("3", string.Empty)
      .ToString();

答案 1 :(得分:31)

我们是否正在努力让更难来了解正在发生的事情?

如果是这样的正则表达式是你的朋友

var replacements = new Dictionary<string,string>()
{
   {"somestring",someVariable1},
   {"anotherstring",someVariable2}
};

var regex = new Regex(String.Join("|",replacements.Keys.Select(k => Regex.Escape(k))));
var replaced = regex.Replace(input,m => replacements[m.Value]);

直播:http://rextester.com/SXXB8348

答案 2 :(得分:27)

你至少可以链接这些陈述:

mystring = mystring.Replace("somestring", variable1)
                   .Replace("somestring2", variable2)
                   .Replace("somestring3", variable3); 

答案 3 :(得分:13)

调用Replace三次不仅是一个有效的答案,它可能是首选答案:

RegEx采取三个步骤:解析,执行,制定。但是String.Replace是硬编码的,因此在很多情况下它具有更高的速度。复杂的RegEx不像格式良好的Replace语句链那样可读。 (将Jonathan的解决方案与Daniel的比较)

如果您仍然不相信Replace更适合您的情况,请参加比赛!并排尝试这两种方法并使用Stopwatch查看使用数据时保存的毫秒数。

但是 DON'T optimize your code unless you need to! 任何开发人员都会更喜欢可读性和可维护性,而不是一堆神秘的意大利面,速度提高3毫秒。

答案 4 :(得分:5)

这篇文章Regex: replace multiple strings in a single pass with C#可能会有所帮助:

static string MultipleReplace(string text, Dictionary replacements) {
    return Regex.Replace(text, 
        "(" + String.Join("|", adict.Keys.ToArray()) + ")",
        delegate(Match m) { return replacements[m.Value]; }
    );
}

// somewhere else in code
string temp = "Jonathan Smith is a developer";
adict.Add("Jonathan", "David");
adict.Add("Smith", "Seruyange");
string rep = MultipleReplace(temp, adict);

答案 5 :(得分:4)

根据您的数据组织方式(您要更换的内容)或您拥有的数量;数组和循环可能是一个很好的方法。

string[] replaceThese = {"1", "2", "3"};
string data = "replace1allthe2numbers3";

foreach (string curr in replaceThese)
{
    data = data.Replace(curr, string.Empty);
}

答案 6 :(得分:2)

如果您不想使用RegEx,请将此类添加到您的项目中,
它使用扩展方法'MultipleReplace':

public static class StringExtender
{
    public static string MultipleReplace(this string text, Dictionary<string, string> replacements)
    {
        string retVal = text;
        foreach (string textToReplace in replacements.Keys)
        {
            retVal = retVal.Replace(textToReplace, replacements[textToReplace]);
        }
        return retVal;
    }
}

然后你可以使用这段代码:

 string mystring = "foobar";

 Dictionary<string, string> stringsToReplace = new Dictionary<string,string>();
 stringsToReplace.Add("somestring", variable1);
 stringsToReplace.Add("somestring2", variable2);
 stringsToReplace.Add("somestring3", variable1);

 mystring = mystring.MultipleReplace(stringsToReplace);

答案 7 :(得分:1)

我首选的方法是使用Regex的强大功能来解决多重替换问题。这种方法的唯一问题是您只能选择一个string来替换。

以下内容会将所有'/'':'替换为'-',以生成有效的文件名。

Regex.Replace("invalid:file/name.txt", @"[/:]", "-");