検索を行う可能性のある関数を呼び出す際、以前の検索で得られたマッチデータを後で利用するために保持しておきたい場合は、その呼び出し前後でマッチデータを保存・復元する必要があるかもしれません。以下に、マッチデータの保存を怠った場合に生じる問題を示す例を挙げます。
(re-search-forward "The \\(cat \\)")
⇒ 48
(foo) ; foo does more searching.
(match-end 0)
⇒ 61 ; Unexpected result—not 48!
save-match-data でマッチデータを保存・復元できます:
このマクロはbodyを実行し、その前後のマッチデータを保存・復元します。戻り値はbody内の最後のフォームの値となります。
set-match-data と match-data を併用することで、特殊形式 save-match-data の効果を再現できます。方法は以下の通りです。
(let ((data (match-data)))
(unwind-protect
... ; Ok to change the original match data.
(set-match-data data)))
Emacsは、プロセスフィルタ関数(プロセスフィルタ関数を参照)やプロセスセンチネル(センチネル:プロセス状態の変化の検出を参照)を実行する際、マッチデータを自動的に保存・復元します。