You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Elisp中replace-regexp-in-string匹配内容转大写问题求助

解决Elisp中LaTeX \textsc{}内容提取并转大写的问题

你的问题出在replace-regexp-in-string的替换参数处理逻辑上:当你直接写(upcase "\\1")时,Elisp会先执行upcase函数,把字符串"\\1"转成大写(结果还是"\\1"),然后再把这个固定字符串作为替换模板,并不会对实际匹配到的分组内容执行大写转换。

要实现对匹配到的分组内容动态处理,你需要把替换参数改成一个函数,replace-regexp-in-string会自动把匹配到的整个字符串、各个分组内容作为参数传给这个函数,你只需要在函数里对目标分组执行upcase即可。

修改后的完整代码如下:

(defun reformat-latex-gloss (beginning end)
  "Strip LaTeX \\textsc{} environments, converting their content to uppercase"
  (interactive "r")
  (when (use-region-p)
    (let* ((gloss (buffer-substring beginning end))
           (replacement
            (replace-regexp-in-string
             "\\\\textsc{\\(.*?\\)}"
             ;; 用lambda函数处理每个匹配项:忽略整个匹配字符串,只取第一个分组转大写
             (lambda (_match group1) (upcase group1))
             gloss
             t ; 全局替换所有匹配项
             t))) ; 启用分组捕获,这样lambda才能拿到分组参数
      ;; 输出到消息缓冲区
      (message "%s" replacement)
      ;; 可选:将结果复制到剪贴板
      (kill-new replacement))))

关键修改点说明:

  • 替换参数从(upcase "\\1")改成了lambda函数(lambda (_match group1) (upcase group1)):_match是整个匹配的字符串(比如\textsc{3sg.h}),我们不需要它,用下划线标记为忽略参数;group1就是\(.*?\)捕获到的内容(比如3sg.h),对它执行upcase就能得到大写结果。
  • 给replace-regexp-in-string加上了最后两个t参数:第一个t表示全局替换所有匹配项,第二个t表示启用分组捕获,这样lambda才能接收到分组内容。
  • 可选添加了(kill-new replacement),直接把结果放到系统剪贴板,满足你后续的需求。

测试这个函数,选中\textsc{3sg.hum}执行后,消息缓冲区会输出3SG.HUM,同时内容也会被复制到剪贴板。

内容的提问来源于stack exchange,提问作者Threefold1520

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 08:50:10