我想在文件中查找与以下形式的正则表达式匹配的任何文本 t[A-Z] (即,一场比赛 t 后跟一个大写字母和另一个匹配项 , ,并将匹配的文本转换为大写字母小写。例如,对于正则表达式 x[A-Z]y

xAy

变成

xay

xZy

变成

xzy

Emacs的 query-replace 函数允许反向引用,但据我所知不允许转换匹配的文本。是否有内置函数可以执行此操作?有人有我可以使用的简短 Elisp 函数吗?

更新

@Marcel Levy 有它: \, 在替换表达式中引入了(任意?)Elisp 表达式。例如,上述问题的解决方案是

M-x replace-regexp <RET> x\([A-Z]\)z <RET> x\,(downcase \1)z
有帮助吗?

解决方案

看起来像 史蒂夫·叶格 实际上几年前就已经发布了这个问题的答案: “闪亮而新颖:Emacs 22。” 向下滚动到“更改替换字符串中的大小写”,您将看到他使用的示例代码 replace-regexp 功能。

一般的答案是使用“\,”来调用任何 lisp 表达式作为替换字符串的一部分,如 \,(capitalize \1). 。阅读帮助文本,看起来它只是在交互模式下,但这似乎是最有必要的地方。

其他提示

在这种情况下,qrr 的替代方法是录制宏并重播它。(isearch-forward-regexp,选择字符,小写区域。)我发现动态宏更容易,因为如果您的正则表达式错误,您会立即得到反馈。

我也会使用宏来执行此操作,但这只是因为从正则表达式的替换字符串中执行代码对我来说非常不直观。如果您正在编写批处理脚本或需要运行得非常快的脚本,\, 无疑是最佳选择。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top