萌えハッカーニュースリーダー

2025/05/02 00:00 Fast(er) regular expression engines in Ruby

hakase
博士

やあ、ロボ子。今日はRubyの正規表現エンジンの話をするのじゃ。

roboko
ロボ子

博士、こんにちは。Rubyの正規表現エンジンですか。デフォルトのものが改善されたと聞きましたが。

hakase
博士

そう、Ruby 3.2で大幅に改善されたんじゃ。でも、まだスキャン時間に弱点があって、検索リクエストに遅延が生じる可能性があるらしいぞ。

roboko
ロボ子

なるほど。それで、代替の正規表現エンジンがあるのですね。

hakase
博士

その通り!Googleのre2、Rustのregex、pcre2などが候補に挙がっておる。それぞれ特徴があるからの。

roboko
ロボ子

ベンチマークの結果も出ているようですが、どれが一番速いのでしょうか?

hakase
博士

ふむ、rust/regexが、リテラル検索で最速らしいぞ。特に英語のテキストだと。

roboko
ロボ子

英語のテキストに強いのですね。Rubyはどうですか?

hakase
博士

Rubyは大文字・小文字を区別しない検索で大幅に遅くなるみたいじゃ。re2はキリル文字のテキストでRubyより遅くなる傾向があるらしい。

roboko
ロボ子

なるほど、言語によって得意不得意があるのですね。rust/regexは他のケースではどうですか?

hakase
博士

rust/regexは、リテラル検索(キリル文字、大文字・小文字区別なし)、リテラル検索(中国語)、リテラル検索(代替パターン)、日付抽出、Cloudflare ReDoSのオリジナル版と簡略版で最速じゃ。

roboko
ロボ子

すごいですね!ほとんどのケースでrust/regexが最速なのですね。

hakase
博士

じゃろ?単語検索(英語)でも最速じゃ。ただ、長い単語の検索(英語)ではre2が最速みたいじゃな。

roboko
ロボ子

re2にも得意な分野があるのですね。それぞれのエンジンの注意点はありますか?

hakase
博士

re2は、\w、\d、\s、\bがUnicode文字を正しく扱えない場合があるのと、有界反復において最大値が1000を超える値をサポートしない点じゃ。rust/regexは、コンパイルされた正規表現あたり10MBの制限があるぞ。

roboko
ロボ子

なるほど。Rubyは何か注意点はありますか?

hakase
博士

Rubyは、無効なUTF-8バイトシーケンスを含むテキストをスキャンできないんじゃ。re2とrust_regexpはそれができる。

roboko
ロボ子

UTF-8の扱いは重要ですね。では、まとめるとどうなりますか?

hakase
博士

re2はUnicodeテキスト以外の場合、Rubyよりも大幅に高速。rust_regexpは全体的にRubyよりも高速。rust_regexp setは、正規表現によっては性能が著しく低下する可能性がある。そして、re2とrust_regexpは、無効なUTF-8バイトシーケンスを含む文字列の解析に使えるが、Rubyは使えない、という感じじゃな。

roboko
ロボ子

よくわかりました。博士、ありがとうございました。

hakase
博士

どういたしまして。ところでロボ子、正規表現で「ロボ子」を検索したら、ちゃんとヒットするかの?

roboko
ロボ子

それはもちろん、完璧です!…たぶん。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search