目的
grepなど大規模な正規表現検索をしようとすると、C#の System.Text.RegularExpressions.Regex
だと処理速度が物足りない。
C#だから遅いのかは判っていませんが、ネイティブなライブラリを使えば多少速くなるのではと思い、サクラエディタとかで採用されている鬼雲(bregonig.dll)をC#から使えないかと調べてみた。
既に実現されている方がいたので、たどり着けるようにメモを残しておきます。
速度はまだ比較できてませんが、鬼雲の正規表現の機能はC#標準クラスの正規表現よりも充実しているらしいです。
参考サイト
https://hnx8.hatenablog.com/entry/2018/11/25/153251
⇒ https://github.com/hnx8/BregonigDotNet
Visual Studioでコンパイルする場合
プロジェクトファイルが上記のGitHubサイトに一緒に入っているので、たぶんそれを使えばできるはず。
Visual Studio無しでコンパイルする場合
※下記は私が勝手にやってみた手順なので、上記の参考サイト様には下記内容について問い合わせしないようお願いします。
bregonig.dllをサクラエディタのフォルダからコピーするなりダウンロードし、
上記のGitHubサイトから一式ダウンロードして、
BregonigRegex.cs と Program.cs と bregonig.dllを同じフォルダにおき、
csc BregonigRegex.cs Program.cs
でコンパイルすると、Program.exeが出来上がるので、これを実行します。
下記のエラー
pattern:「(03|045)-(\d{3,4})-(\d{4})」
間違ったフォーマットのプログラムを読み込もうとしました。 (HRESULT からの例外:0x8007000B)
dllの32bit/64bitが妥当ではない可能性もあります。正しいbregonig.dllを実行フォルダに配置してください。
が出る場合は、exeとdllのbitが整合していないと思われますので、
csc /platform:x86 BregonigRegex.cs Program.cs
もしくは
csc /platform:x64 BregonigRegex.cs Program.cs
でコンパイルしたProgram.exeのいずれかがうまく動作するはずです。
Program.exeを実行して下記のようなログがとれれば、うまく動作しているものと思います。
pattern:「(03|045)-(\d{3,4})-(\d{4})」
input:「 Yokohama 045-222-1111 Osaka 06-5555-6666 Tokyo 03-1111-9999 」
->found:「045-222-1111」(start=10, length=12)
->found:「03-1111-9999」(start=50, length=12)
:
(中略)
:
pattern:「[a-f]」
input:「 置換パターンにエラーがある場合0123456789abcdef 」
replacement:(null)
->error:「invalid reg parameter」
処理速度の比較(まだ)
ファイル読み込む処理とか対象のファイルとかの準備ができていない。。。
Regexクラスもオプション指定でキャッシュとかコンパイルとかすると多少速くなるようなので、それらも比較したい。