[解決済み】文字列から特殊文字を削除する最も効率的な方法
質問
ある文字列から特殊文字をすべて削除したい。使用できる文字は、A-Z(大文字または小文字)、数字(0-9)、アンダースコア(_)、ドット記号(...)です。
私は次のようなものを持っています、それは動作しますが、私はそれが非常に効率的ではないことを疑う(私は知っている!)。
public static string RemoveSpecialCharacters(string str)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.Length; i++)
{
if ((str[i] >= '0' && str[i] <= '9')
|| (str[i] >= 'A' && str[i] <= 'z'
|| (str[i] == '.' || str[i] == '_')))
{
sb.Append(str[i]);
}
}
return sb.ToString();
}
最も効率的な方法は何でしょうか?正規表現はどのようなもので、通常の文字列操作と比較してどうなのでしょうか?
クリーニングされる文字列は、通常10文字から30文字程度の短いものです。
解決方法
なぜ、その方法は効率的でないと思うのですか?実は、最も効率的な方法の一つなんです。
もちろん、その文字をローカル変数に読み込んだり、配列へのアクセス回数を減らすためにエニュメレータを使用する必要があります。
public static string RemoveSpecialCharacters(this string str) {
StringBuilder sb = new StringBuilder();
foreach (char c in str) {
if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '.' || c == '_') {
sb.Append(c);
}
}
return sb.ToString();
}
このようなメソッドが効率的なのは、スケールが良いということです。実行時間は文字列の長さに対して相対的なものになります。大きな文字列で使っても、驚くようなことはない。
編集する
24文字の文字列で各関数を100万回実行し、簡単な性能テストをしてみました。その結果がこれだ。
オリジナル関数です。54.5ミリ秒
私の提案した変更点 47.1ms。
StringBuilderの容量を設定した場合の私:43.3ms。
正規表現:294.4ms
編集2 上のコードにA-Zとa-zの区別を追加しました。(パフォーマンステストを再実行しましたが、目立った違いはありません)。
編集3
lookup+char[]の解決策をテストしてみたところ、約13msで実行されました。
その代償は、もちろん、巨大なルックアップテーブルの初期化とメモリへの保持です。まあ、それほど大きなデータ量ではないのですが、こんなつまらない関数にしては多いですね...。
private static bool[] _lookup;
static Program() {
_lookup = new bool[65536];
for (char c = '0'; c <= '9'; c++) _lookup[c] = true;
for (char c = 'A'; c <= 'Z'; c++) _lookup[c] = true;
for (char c = 'a'; c <= 'z'; c++) _lookup[c] = true;
_lookup['.'] = true;
_lookup['_'] = true;
}
public static string RemoveSpecialCharacters(string str) {
char[] buffer = new char[str.Length];
int index = 0;
foreach (char c in str) {
if (_lookup[c]) {
buffer[index] = c;
index++;
}
}
return new string(buffer, 0, index);
}
関連
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み] JavaScriptでランダムな文字列/文字を生成する
-
[解決済み] どうすれば、文字列中のリテラルな中抜き文字を印刷し、また.formatを使用することができるのでしょうか?
-
[解決済み] C++でintをstringに変換する最も簡単な方法
-
[解決済み] 複数行の長い文字列を作成するためのPythonicな方法
-
[解決済み] ファイルの内容からJavaの文字列を作成するにはどうすればよいですか?
-
[解決済み] IList<string> または IEnumerable<string> からカンマ区切りリストを作成する。
-
[解決済み] JavaScriptで文字列から数字以外の文字を取り除く
-
[解決済み] 文字列からテキストを削除するには?
-
[解決済み] Pythonで文字列から特定の文字を削除する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み】SmtpException: トランスポート接続からデータを読み取れません:net_io_connectionclosed
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み】パラメータ付きRedirectToAction
-
[解決済み】WebResource.axdとは何ですか?
-
[解決済み] 文字列からダッシュ以外のすべての英数字を削除するには?