【问题标题】:Emacs query-replace with textual transformationEmacs 查询替换与文本转换
【发布时间】:2010-09-08 15:15:38
【问题描述】:

我想在文件中查找与 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

【问题讨论】:

    标签: regex emacs


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2011-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-21
          • 1970-01-01
          相关资源
          最近更新 更多