elisp: Saving Match Data

 
 33.6.4 Saving and Restoring the Match Data
 ------------------------------------------
 
 When you call a function that may search, you may need to save and
 restore the match data around that call, if you want to preserve the
 match data from an earlier search for later use.  Here is an example
 that shows the problem that arises if you fail to save the match data:
 
      (re-search-forward "The \\(cat \\)")
           ⇒ 48
      (foo)                   ; ‘foo’ does more searching.
      (match-end 0)
           ⇒ 61              ; Unexpected result—not 48!
 
    You can save and restore the match data with ‘save-match-data’:
 
  -- Macro: save-match-data body...
      This macro executes BODY, saving and restoring the match data
      around it.  The return value is the value of the last form in BODY.
 
    You could use ‘set-match-data’ together with ‘match-data’ to imitate
 the effect of the special form ‘save-match-data’.  Here is how:
 
      (let ((data (match-data)))
        (unwind-protect
            ...   ; Ok to change the original match data.
          (set-match-data data)))
 
    Emacs automatically saves and restores the match data when it runs
 process filter functions (SeeFilter Functions) and process
 sentinels (SeeSentinels).