RegexOptions.IgnoreCase,功能最強但效能最差CompareMethod.Text原理:預先計算最大可能結果長度,配置 char[] 緩衝區,單次掃描原字串,以 IndexOf 定位比對位置,直接寫入緩衝區,最後 new string(buffer, 0, count) 產生結果。支援選擇性忽略大小寫。
private static string ReplaceEx(string original, string pattern, string replacement, bool ignoreCase = true) {
if (string.IsNullOrEmpty(pattern)) return original;
var src = ignoreCase ? original.ToUpper() : original;
var pat = ignoreCase ? pattern.ToUpper() : pattern;
int maxLen = original.Length + Math.Max(0, (original.Length / pattern.Length) * (replacement.Length - pattern.Length));
var buffer = new char[maxLen];
int count = 0, pos0 = 0, pos1;
while ((pos1 = src.IndexOf(pat, pos0)) != -1) {
// 複製未比對段
for (int i = pos0; i < pos1; i++) buffer[count++] = original[i];
// 複製取代字串
for (int i = 0; i < replacement.Length; i++) buffer[count++] = replacement[i];
pos0 = pos1 + pattern.Length;
}
// 複製剩餘尾段
for (int i = pos0; i < original.Length; i++) buffer[count++] = original[i];
return new string(buffer, 0, count);
}
| 測試資料 | Regex | VB Replace | ReplaceEx | String.Replace |
|---|---|---|---|---|
| 短字串、少量比對 | 3.75s | 1.53s | 0.80s | 0.18s |
| 中等字串、多比對 | 5.30s | 2.46s | 1.01s | 0.23s |
| 長字串、密集比對 | 13.59s | 11.68s | 1.70s | 0.42s |
結論:String.Replace(區分大小寫)最快;需忽略大小寫時,ReplaceEx 大幅優於 Regex 與 VB 版本,適合高頻、大資料量場景。
String.ReplaceMicrosoft.VisualBasic.Strings.ReplaceReplaceEx 或 StringBuilder 手寫Regex.Replace(接受效能代價)