Operaだけ何故か極端に高速な正規表現パターン

とても単純な正規表現だけれど、照合するのに非常に時間のかかるパターンがあります。下記はその一例。

var s = "abcdefghijklmnopqrstuvwxyz".match(/a(.+)+c/);

照合することは一目瞭然です。しかし、+ は最長一致型の照合なので2重のバックトラックが発生して、上の文字列の場合、一番最後になって照合が確認されることになります。たぶん、直感的には入力文字列の長さに応じて指数オーダで時間がかかるのだと思います。

実際にブラウザ上で確認すると、ChromeIEは数秒程度かかりました。Firefoxは「警告:応答のないスクリプト」のポップアップが表示されてしまいました。

ところが、Operaは一瞬です。Date関数で処理時間を測定してもゼロです。Safariも結構高速で、数ミリ秒程度です。

通常、正規表現の実行は、オートマトンを実行する中間コードにコンパイルされますが、OperaSafariはその最適化がなされているのかな、と思います。上のパターンの場合、1000倍以上の違いがあります。ベンチマークをとってみるのも面白いかも。

ちなみに、Perlも高速でした。残念ながらRubyは遅いです。