Previous: Entire Match Data, Up: Match Data


33.6.4 マッチデータの保存と復元

探索を行う可能性がある関数を呼び出す場合、 あとで使うためにそれ以前の探索によるマッチデータを保存したいときには、 当該関数の呼び出しの周りでマッチデータを保存し復元する必要があります。 つぎの例は、マッチデータを保存し損なった場合に生じる問題点を 示しています。

     (re-search-forward "The \\(cat \\)")
          ⇒ 48
     
     
     (foo)                   ; fooはさらに
                             ;   探索する
     (match-end 0)
     
          ⇒ 61              ; 予期しない結果。48でない!

マッチデータの保存と復元はsave-match-dataで行えます。

— Macro: save-match-data body...

このマクロは、周りのマッチデータを保存し復元して、 bodyを実行する。

スペシャルフォームsave-match-dataの効果をまねるために match-dataとともにset-match-dataを使うこともできます。 つぎのようにします。

     (let ((data (match-data)))
       (unwind-protect
     
           ...   ; もとのマッチデータを変更しても大丈夫
         (set-match-data data)))

プロセスフィルタ関数(see Filter Functions)や プロセスの番兵(see Sentinels)を実行するときには、 Emacsは自動的にマッチデータを保存し復元します。