2017-03-17 74 views
1

我有一堆来自SQL查询的列名,我想摆脱使用Emacs的AS之前的所有内容。换句话说,我想去从Emacs:替换正则表达式返回0匹配

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消息。

我在做什么错?

+0

您可能需要将点放在文件/选区的顶部。 –

+1

您正在转义'.'和'*',而不是将它们解释为正则表达式特殊字符。 – Drew

回答

1

我可以用下面这样做:

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

注意光标必须是需要更换的线(S)以上。我以前没有用过这个,但它是交互式的(每次替换时都按'y',这可能会自动/全局地完成,但我没有玩过。

+0

干得好!你可能正在寻找'!'来做所有的替换。 – Ehvince

+0

谢谢!这很好。为什么你不用'重新建造者'时必须在这里使用圆括号? – finbarr

+0

这就是我学到的东西,从来没有真正看过它。 –

2

通过使用re-builder一个好主意)创建互动使用正则表达式,你再感到困惑不同的正则表达式语法选项之间。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其中.*字符,这是特别的正则表达式已经越狱,并因此失去其特殊的含义,并在文本反而会匹配文字.*字符。

但是请注意,交互进入正则表达式时,应包括周围的双引号字符"存在于re-builder甚至其string语法模式。如果您以交互方式输入"字符,则正则表达式将与包含那些"字符的文本匹配。