使用正则表达式、分组捕获和反向引用进行查找和替换

10

我正在尝试在SQL Server 2008 R2 Management Studio中执行查找和替换操作,并使用组捕获,以便在替换中反向引用这些组。根据这个,我了解到SSMS使用Visual Studio 2005的正则表达式引擎。以下是我的一个示例:

SELECT First FROM Table1
SELECT Second FROM Table2
SELECT Third FROM Table3

这是我的“查找”表达式:

SELECT (.+) FROM (.+)

这是我的“替换”表达式:

\1 \2

然而,运行替换操作导致没有捕获的组返回,即每一行只是一个空格 " "(<---就是两个反向引用之间的空格)。

我做错了什么?


我可能理解错了,但是你不应该将其替换为$1、$2吗?因为\1是在正则表达式中引用捕获的组,但是对于所有目的而言,替换表达式都是一个新的表达式。 - Andris Leduskrasts
1
不,$1和$2不起作用。它们会将自己作为文字返回,即“$1 $2”。 - rory.ap
2个回答

11

对于SSMS 17及更高版本,{ ... }\1 将无法工作。请改用( ... )$1


9

SQL Server Management Studio引擎使用{}来“标记”表达式:

SELECT {.+} FROM {.+}

当你将这个与\1 \2替换表达式结合起来时,你会得到预期的结果:
First Table1
Second Table2
Third Table3

VS 正则表达式参考页面详细解释了相关内容。


那是哪种正则表达式呢?有相关的参考资料吗? - rory.ap
@roryap 我不知道这种特定的正则表达式有没有名称,但我链接的文档页面专门讨论了这种差异:“在“查找”和“替换”窗口中,大括号 {} 用于标记要替换的表达式”,在 .NET Framework 编程中可以使用的正则表达式与这些之间存在许多语法差异。 - Sergey Kalinichenko
在SSMS 2016(13.0.14000.36)中如何做相同的事情? - jumxozizi
2
由于某种奇怪的原因,在SSMS中他们使用$1而不是\1... 不确定这来自哪个正则表达式方言... - Wouter
我刚在 SSMS 2014 中尝试了一下,发现 $1 只是被当做字面量处理,而 \1 则返回空值;然而 \0 似乎会返回整个表达式。仅供参考,我使用的正则表达式是:R(M|D|T),匹配成功并且 \1 应该返回 MDT - Matt Arnold
1
@Wouter - 这方面有很多先前的艺术,如PHP、JavaScript、C#等。\1等符号在表达式内用于引用捕获(例如,(["']).*?\1匹配""''之间的内容,但不匹配"'),但在替换模式中,通常使用$1等符号。 - T.J. Crowder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接