我想知道替换一串需要依次替换的字符串中最简单的方法。
例如:
var str = "[Hello World]";
//enclose all occurences of [ and ] with brackets[]
str = str.Replace("[","[[]").Replace("]","[]]");
- 期望结果:
[[]Hello World[]]
- 实际结果:
[[[]]Hello World[]]
显然原因是在已修改的字符串上执行了第二次替换。
那么如何将所有“坏”字符替换为包含“坏”字符的字符?
对所有方法进行快速测量后,StringBuilder 是最有效的方法。
190kb 文件(全部毫秒)
regexTime 40.5065
replaceTime 20.8891
stringBuilderTime 6.9776
7MB文件
顺便提一下,直接使用regexTime 1209.3529 replaceTime 403.3985 stringBuilderTime 175.2583
StringBuilder
方法比John的方法要快两倍,而Sehe的Aggregate方法则较慢。我已将其制作成扩展程序:public static String EncloseChars(this string input, char[] charsToEnclose, String leftSide, String rightSide) {
if (charsToEnclose == null || leftSide == null || rightSide == null)
throw new ArgumentException("Invalid arguments for EncloseChars", charsToEnclose == null ? "charsToEnclose" : leftSide == null ? "leftSide" : "rightSide");
Array.Sort(charsToEnclose);
StringBuilder sb = new StringBuilder();
foreach (char c in input) {
if (Array.BinarySearch(charsToEnclose, c) > -1)
sb.Append(leftSide).Append(c).Append(rightSide);
else
sb.Append(c);
}
return sb.ToString();
}
"[Hello World]".EncloseChars(new char[]{'[', ']'},"[","]");