正規表現:Perlの正規表現は非常に遅いです。最適化する方法は?

正規表現:Perlの正規表現は非常に遅いです。最適化する方法は?

これ:

echo BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BBBBBBBBBBBBBBBBBBBBBBBBBBBBA |
  perl -pe '/^(.*?B(?:A.*?B){30})A/'

私のコンピュータでは、なんと8秒かかりました。私はそれが最大数ミリ秒かかると思いました。

10ms未満かかります。

echo BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BBBBBBBBBBBBBBBBBBBBBBBBBBBBA |
   perl -pe '/^(.*?B(?:A.*?B){30})A/'

最初の作業をより早く進めるにはどうすればよいですか?

正規表現になるにはAとBが必要です。つまり、これらは単純な単一文字ではありません。

ベストアンサー1

負の予測合計の使用.:

perl -pe '/^((?:(?!BA).)*?B(?:A(?:(?!BA).)*?B){30})A/'

きれいではありませんが効果的です。

おすすめ記事