string から特定のいくつかの文字を消去したい
たとえばある文字列からスペース、タブ、改行を削除したい場合にはどうやって書くんだろう?
Split + Join?
string str2 = string.Join("", str.Split(' ', '\t', '\r', '\n'));
文字列の Replace?
string str2 = str.Replace(" ", ""); str2 = str2.Replace("\t", ""); str2 = str2.Replace("\r", ""); str2 = str2.Replace("\n", "");
IndexOfAny + Remove?
string str2 = str; int index = 0; char[] c = new char[] { ' ', '\t', '\r', '\n' }; while ((index = str2.IndexOfAny(c, index)) != -1) { str2 = str2.Remove(index, 1); }
まあ Remove 使うのはありえないとして、もうちょい発展させて StringBuilder を使ってみるとか?
string str2; StringBuilder builder = new StringBuilder(str.Length); // このキャパだけあれば再確保は絶対に無い int old = 0; int index = 0; char[] c = new char[] { ' ', '\t', '\r', '\n' }; while ((index = str.IndexOfAny(c, index)) != -1) { builder.Append(str, old, index - old); old = ++index; } builder.Append(s, old, str.Length - old); str2 = builder.ToString();
これはさすがにめんどすぎ。
うーん、ある程度の速度と簡潔さを両方持ってるっぽい気のする Split + Join のやり方が一番なのかなぁ……。
C++ の string なら mutable なので、
struct pred { bool operator()(char c) const { return c == ' ' || c == '\t' || c == '\r' || c == '\n'; } }; std::string str2 = str; str2.erase(std::remove_if(str2.begin(), str2.end(), pred()), str2.end());
これだけで済むんだけど……。
ついでに C++0x なら
std::string str2 = str; str2.erase(std::remove_if(str2.begin(), str2.end(), [](char c) { return c == ' ' || c == '\t' || c == '\r' || c == '\n'; }), str2.end());
こうかな。