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

时间:2017-03-17 17:52:01

标签: regex emacs

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

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

Has_work_order,

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

我做错了什么?

2 个答案:

答案 0 :(得分:2)

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

有关说明和说明,请参阅Why do regular expressions created with the regex builder use syntax different from the interactive regular expressions?

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

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

答案 1 :(得分:1)

我能够通过以下方式实现这一目标:

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

请注意,光标必须位于需要替换的行上方。我之前没有使用过它,但它是互动的(按下&#39; y&#39;对于每次更换,这可以自动/全局完成,但我&# 39;没有玩过它。