Emacs:替换正则表达式返回 0 个匹配项



我有一堆来自SQL查询的列名,我想在使用EmacsAS之前删除所有内容。换句话说,我想从

MAX(CASE WHEN maintenance.work_order IS NULL THEN 1 ELSE 0 END) AS Has_work_order,

Has_work_order,

我使用re-builder创建了一个简单的正则表达式:".*AS ",它突出显示了缓冲区的相应部分。但是,当我选择整个缓冲区并使用M-x query-replace-regexp <RET> ".*AS " <RET> "" <RET>运行query-replace-regexp时,Emacs 会显示一条Replaced 0 occurrences消息。

我做错了什么?

通过使用re-builder(这是一个好主意)来创建用于交互式使用的正则表达式,您将在不同的正则表达式语法选项之间感到困惑。re-builder默认为read语法(在编写 elisp 代码时会使用该语法),而对于交互式使用,您需要string语法。

有关解释和说明,请参阅为什么使用正则表达式生成器创建的正则表达式使用的语法与交互式正则表达式不同?

在读取语法中,.*AS表示正则表达式.*AS(因为读取字符串时.*并不特殊,所以这些反斜杠是多余的);但在字符串语法中,.*AS是正则表达式.*AS其中正则表达式特有的.*字符已被转义,因此失去了它们的特殊含义, 而是匹配文本中的文字.*字符。

但是请注意,以交互方式输入正则表达式时,您不应包含re-builder中存在的"周围的双引号字符,即使对于其string语法模式也是如此。如果以交互方式输入"字符,则正则表达式将匹配包含这些"字符的文本。

我能够通过以下方式做到这一点:

M-x query-replace-regexp <RET> (.+)AS <RET> <RET>

请注意,光标必须位于需要替换的行上方。我以前没有用过这个,但它是交互式的(按'y'进行每次替换,这也许可以自动/全局完成,但我还没有玩过它。

最新更新