正規表現 バックトラック回数が多くてタイムアウトが発生していた。

原因

前後の空白を削除する処理を使うときに
いくつかのデータのみ、文中に全角スペースが連続で30文字程度以上あった時にタイムアウトが発生していた。

解決方法

直前の文字が1回以上繰り返す場合にマッチする「+」の部分を「++」に変更した。

バックトラックとは?「+」と「++」 の違いは?

普段使う「+」はできるだけ長いパターンにマッチしようと、一度マッチに失敗しても、
バックトラックして戻りながらパターンを探す感じ?
それと比べて、絶対最大量指定子である「++」は一度マッチすると、
その後マッチに失敗してもバックトラックをしないそう。なので、パフォーマンスが改善されると思った。(マッチさせたいパターンによりそう)

感想

バックトラックというのを初めて聞いた。
「++」に変更したことでタイムアウトは無くなった
まだ理解の途中であります。正規表現むずい。
参考記事等を見ながら理解していきます。

参考記事

パフォーマンスを意識して正規表現を書く - Shin x Blog

【PHP】マルチバイト(全角スペース等)対応のtrim処理 - Qiita