replace-regexp-in-string 中的 Elisp 大写匹配

问题描述 投票:0回答:1

我想从 LaTeX 标记中提取内容,修改内容,然后将其复制到剪贴板。具体来说,我想将所有内容拉入

\textsc{}
环境中并将其更改为大写。这需要类似
\textsc{3sg.hum}
的东西并输出
3SG.HUM
。到目前为止我编写的函数将删除标记,但不会将其内容大写,因此当我在
\textsc{3sg.hum}
上运行函数时,它会输出
3sg.hum

这是我到目前为止编写的代码。截至目前,我只是将输出写入消息缓冲区,稍后我将处理剪贴板的内容。

(defun reformat-latex-gloss (beginning end)
  "Strip LaTeX environments, converting small caps to uppercase"
  (interactive "r")
  (if (use-region-p)
      (let* ((gloss (buffer-substring beginning end))
             (replacement
              (replace-regexp-in-string
               "\\\\textsc{\\(.*?\\)}"
               (upcase "\\1")
               gloss
               nil)))
        (message "%s" replacement))
    ""
    )
  )

当我在

\textsc{3sg.h}
之类的东西上运行此函数时,它输出
3sg.h
而不是预期的
3SG.H
。线路好像有问题
(upcase "\\1")
;如果我将
\\1
替换为像
test
这样的字符串,输出将为大写
TEST
,所以看起来
upcase
并不像我预期的那样应用于编号匹配。

我没有运气找到这个问题的解决方案。像 this 这样的许多资源都展示了如何在交互模式下执行此类操作,但我想以非交互方式运行它。我对 Elisp 还很陌生,所以我可能会忽略一些简单的事情。感谢您的帮助!

elisp
1个回答
0
投票

我想出了一个解决办法。我需要将替换内容包装在 lambda 表达式中并调用

match-string
,因此功能代码是

(defun reformat-latex-gloss (beginning end)
  "Strip LaTeX environments, converting small caps to uppercase"
  (interactive "r")
  (if (use-region-p)
      (let* ((gloss (buffer-substring beginning end))
             (replacement
              (replace-regexp-in-string
               "\\\\textsc{\\(.*?\\)}"
               (lambda (match)
                 (upcase (match-string 1 match)))
               gloss)))
        (message "%s" replacement))
    ""
    )
  )
© www.soinside.com 2019 - 2024. All rights reserved.