指定した文字以外のすべての文字を置き換える方法があります。例えば、
ReplaceNot("test. stop; or, not", ".;/\\".ToCharArray(), '*');
戻るだろう
"****.********;***,****".
さて、これは時期尚早の最適化の例ではありません。ネットワーク操作中に、このメソッドをかなりの回数呼び出します。長い文字列では、遅延が発生することがわかりました。これを削除すると少し効果がありました。これをスピードアップするための助けをいただければ幸いです。
public static string ReplaceNot(this string original, char[] pattern, char replacement)
{
int index = 0;
int old = -1;
StringBuilder sb = new StringBuilder(original.Length);
while ((index = original.IndexOfAny(pattern, index)) > -1)
{
sb.Append(new string(replacement, index - old - 1));
sb.Append(original[index]);
old = index++;
}
if (original.Length - old > 1)
{
sb.Append(new string(replacement, original.Length - (old + 1)));
}
return sb.ToString();
}
最後の # です。また、3K 文字列のテスト ケースを追加し、1M ではなく 100K 回実行して、これらの各スケールがどれだけうまくいくかを確認しました。唯一の驚きは、正規表現が他のものよりも「スケーリングが優れている」ことでしたが、最初は非常に遅いため、助けにはなりません:
ユーザー ショート * 1M ロング * 100K スケール ジョン 319 2125 6.66 ルーク 360 2659 7.39 グッファ 409 2827 6.91 鉱山 447 3372 7.54 ダークジェントリー 1094 9134 8.35 マイケル 1591 12785 8.04 ピーター 21106 94386 4.47
更新: Peter のバージョンの正規表現の作成を静的変数にし、公平を期すために RegexOptions.Compiled に設定しました。
ユーザー ショート * 1M ロング * 100K スケール ピーター 8997 74715 8.30
私のテストコードへのPastebinリンク、間違っている場合は修正してください: http://pastebin.com/f64f260ee