9

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

xAy

变成

xay

xZy

变成

xzy

Emacs 的query-replace功能允许反向引用,但 AFAIK 不允许匹配文本的转换。有没有内置函数可以做到这一点?有人有我可以使用的简短 Elisp 功能吗?

更新

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

M-x replace-regexp <RET> x\([A-Z]\)z <RET> x\,(downcase \1)z
4

3 回答 3

14

看起来Steve Yegge实际上在几年前就已经发布了这个问题的答案:“Shiny and New: Emacs 22”。向下滚动到“在替换字符串中更改大小写”,您将看到他使用该replace-regexp函数的示例代码。

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

于 2008-09-11T22:19:19.673 回答
1

在这种情况下,qrr 的替代方法是录制宏并重放它。(isearch-forward-regexp,选择字符,downcase-region。)我发现动态宏更容易,因为如果您的 regexp 错误,您会立即获得反馈。

于 2008-09-15T22:54:06.560 回答
0

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

于 2008-09-16T06:16:49.600 回答