用坏字符替换String的错误字符

Tim*_*ter 8 .net c# string replace

我只是想知道什么是替换必须随后替换的字符串字符的最简单方法.

例如:

var str = "[Hello World]";
//enclose all occurences of [ and ] with brackets[] 
str = str.Replace("[","[[]").Replace("]","[]]");
Run Code Online (Sandbox Code Playgroud)
  • 期望的结果: [[]Hello World[]]
  • 实际结果: [[[]]Hello World[]]

原因显然是已经修改过的字符串的第二个替换.

那么如何用包含"坏"字符的字符替换所有"坏"字符的出现?


快速测量所有方法表明StringBuilder是最有效的方法.

190kb文件(全部以毫秒为单位)

  regexTime           40.5065  
  replaceTime         20.8891  
  stringBuilderTime    6.9776
Run Code Online (Sandbox Code Playgroud)

7MB文件

  regexTime           1209.3529           
  replaceTime          403.3985   
  stringBuilderTime    175.2583
Run Code Online (Sandbox Code Playgroud)

顺便说一句,John的直接StringBuilder方法 是SeheAggregate方法的两倍.

我做了一个扩展:

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[]{'[', ']'},"[","]");
Run Code Online (Sandbox Code Playgroud)

Joh*_*ant 5

这是一种非常不酷的方式.但它的优点是非常接近万无一失,我认为,并且不使用正则表达式(如果您不想使用正则表达式).

StringBuilder sb = new StringBuilder();
foreach (char c in str.ToCharArray()) {
    if (c == '[' || c == ']') {
        sb.Append('[' + c + ']');
    }
    else {
        sb.Append(c);
    }
}
string result = sb.ToString();
Run Code Online (Sandbox Code Playgroud)