byte 配列での文字列検索

C# の byte 配列に対して、文字列検索を行うメソッドは標準では用意されていません。でも、必要に迫られることはあるわけで、文字列照合アルゴリズムの一つ「Boyer-Moore(BM)法」を改良したアルゴリズム「Sunday のアルゴリズム (Sunday Algorithm)」の C++ で書かれたサンプルプログラムを C# にポーティングしました。

ポーティング元は、「Fussyのホームページ」さんの「検索アルゴリズム(4) 文字列の検索 -2-」に掲載されている C++ のサンプルプログラムです。Sunday のアルゴリズムをご存じない方は、リンク先のページに詳しい説明が書かれているので、ご覧になるとよいと思います😉

C# のプログラムは、byte 配列に対する拡張メソッドとして実装しました。

使い方は、次のような感じで。


            var text = "abadあいかきあいうえおかきfiokj";
            var textBytes = Encoding.UTF8.GetBytes(text);
            var pattern = "あいうえお";
            var patternBytes = Encoding.UTF8.GetBytes(pattern);
            var actual = textBytes.SearchBytesSunday(patternBytes, 0);

実行結果は、actual に 16 が格納されます(utf-8 でエンコードすると、a, b, a, d は各 1 バイト、あ, い, か, き は各 3 バイトになるため(基本多言語面(BMP, 第0面)外(第1面以降)に収容される文字(絵文字など)は、4 バイトになります))。

なお、日本語(というか、ASCII 文字以外)を含む文字列を検索する場合、文字コードのエンコーディングは UTF-8 を利用するのが無難だと思います。UTF-16 はバイトの並び順(ビッグ・エンディアン/リトル・エンディアン)で引っかかる可能性があり(検索先バイト配列の生成、検索するバイト配列の生成ともに同じバイト並び順となっていれば問題ない)、シフト JIS、ISO-2022-JP、EUC だと異なる文字のバイト表現中に同じ値が現れてしまうことへの考慮が必要になります。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です