当调用可能执行搜索的函数时,若需要保留此前搜索产生的匹配数据供后续使用,则应当在该函数调用前后保存并恢复匹配数据。下面的例子展示了不保存匹配数据时会出现的问题:
(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
... ; 在此处修改原始匹配数据不会产生影响。
(set-match-data data)))
Emacs 在运行进程过滤器函数(see 进程过滤器函数)与进程哨兵函数(see 哨兵函数:检测进程状态变化)时,会自动保存和恢复匹配数据。