Emacsの正規表現実装は、同種の多くの実装と同様に概ね堅牢ですが、時折、次の2つのパターンのいずれかで問題が発生することがあります。マッチング時に内部スタック領域が不足してエラーがシグナルされる場合と、完了までに長い時間を要する場合です。以下のアドバイスに従うことで、こうした症状が発生する可能性を低くし、実際に問題が生じた際の軽減に役立ちます。
\`)を用いて、行、文字列、またはバッファの先頭に正規表現をアンカーします。これにより、実装上の高速パスを活用でき、無駄なマッチング試行を回避できます。その他のゼロ幅アサーションも、マッチングを早期に失敗させることでメリットをもたらす場合があります。
(トレードオフの関係にあります。マッチングに成功したorパターンは、最も頻繁にマッチするパターンから順に高速に実行されます。)
特に入れ子になった繰り返し表現には注意してください。曖昧さがある場合、マッチングに非常に時間がかかることがあります。例えば、‘\(?:a*b*\)+c’ は、中程度の長さの ‘a’ の文字列であっても、マッチングを試みて失敗するまで長い時間を要します。同等の ‘\(?:a\|b\)*c’ ははるかに高速であり、‘[ab]*c’ はさらに高速です。
rx の使用を検討してください(rx
構造化正規表現表記を参照)。これにより、一部の OR
パターンを自動的に最適化でき、明示的に要求しない限りキャプチャグループが導入されることはありません。
上記のアドバイスに従っても正規表現のスタックオーバーフローが発生する場合は、バックトラッキングをより容易に抑制できるシンプルな正規表現を用い、複数の関数呼び出しに分けてマッチング処理を行うことをためらわないでください。
正規表現や正規表現エンジン自体の問題の診断に役立てるため、この関数は regexp
のコンパイル済み形式を説明する文字列を返します。その内容を理解するには、Emacs のソースコードにある src/regex-emacs.c ファイル内の re_opcode_t 型の説明を少なくとも読んでおく必要があるかもしれません。
現在、Emacsが--enable-checkingでコンパイルされている場合にのみ、意味のある説明が可能です。