Emacs查询替换文本转换

时间:2008-09-11 21:54:47

标签: regex emacs

我想在文件中找到与 t [A-Z] u 形式的正则表达式匹配的任何文本(即匹配 t < / em>后跟一个大写字母和另一个匹配 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

3 个答案:

答案 0 :(得分:13)

看起来Steve Yegge实际上已经在几年前发布了答案:"Shiny and New: Emacs 22."向下滚动到“更换字符串中的更改案例”,您将看到他的示例代码使用{{ 1}}功能。

一般的答案是你使用“\”来调用任何lisp表达式作为替换字符串的一部分,就像在replace-regexp中一样。阅读帮助文本,看起来它只是在交互模式下,但这似乎是最需要的地方。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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