35.6.1 替换匹配的文本

该函数用于替换最近一次搜索所匹配的全部或部分文本,其工作依赖匹配数据。

Function: replace-match replacement &optional fixedcase literal string subexp

该函数对缓冲区或字符串执行替换操作。

如果最近一次搜索是在缓冲区中进行,应省略 string 参数或将其设为 nil,并确保当前缓冲区就是执行搜索的缓冲区。此时函数会修改缓冲区,用 replacement 替换匹配文本,并将光标留在替换文本的末尾。

如果最近一次搜索是针对字符串,则将同一字符串作为 string 传入。此时函数会返回一个新字符串,其中匹配内容已被 replacement 替换。

如果 fixedcasenilreplace-match 将直接使用替换文本,不进行大小写转换;否则会根据待替换文本的大小写格式自动转换替换文本。若原文本全为大写,替换文本会转为大写;若原文本每个单词首字母均大写,替换文本每个单词也会首字母大写;若所有单词均为单个大写字母,则按首字母大写格式处理,而非全大写。

如果 literalnilreplacement 会原样插入,仅按需进行大小写变更。若为 nil(默认值),字符 ‘\’ 会被特殊处理。替换文本中出现的 ‘\’ 必须是下列序列之一:

\&

代表整个被替换的匹配文本。

\n’, where n is a digit

代表原正则表达式中第 n 个子表达式的匹配文本。子表达式指由 ‘\(…\)’ 包裹的分组。若第 n 个子表达式未参与匹配,则替换为空字符串。

\\

代表替换文本中的单个反斜杠 ‘\’。

\?

代表其自身(为兼容 replace-regexp 及相关命令;see Regexp Replace in The GNU Emacs Manual)。

\’ 后跟随其他任意字符均会报错。

\&’ 与 ‘\n’ 执行的替换发生在大小写转换之后,因此它们替换的内容不会再被转换大小写。

如果 subexpnil,表示只替换匹配正则表达式的第 subexp 个子表达式,而非整个匹配结果。例如,在匹配 ‘foo \(ba*r\)’ 后,以 1 作为 subexp 调用 replace-match,将只替换匹配 ‘\(ba*r\)’ 的文本。

Function: match-substitute-replacement replacement &optional fixedcase literal string subexp

该函数返回 replace-match 本应插入缓冲区的文本,但不会修改缓冲区。如果你需要向用户展示实际替换结果(将 ‘\n’、‘\&’ 等结构替换为对应分组),该函数会很有用。参数 replacement 及可选参数 fixedcaseliteralstringsubexp 的含义与 replace-match 完全一致。