【问题标题】:Find and replace using regular expression, group capturing, and back referencing使用正则表达式、组捕获和反向引用查找和替换
【发布时间】:2015-09-26 14:20:31
【问题描述】:

我正在尝试在 SQL Server 2008 R2 Management Studio 中执行查找和替换操作并使用组捕获,以便我可以在替换中反向引用组。我从this 了解到,SSMS 使用the Visual Studio 2005 regex engine。这是我所拥有的示例:

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

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

SELECT (.+) FROM (.+)

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

\1 \2

但是,运行替换操作不会返回任何捕获的组,即每一行只是“”(

我做错了什么?

【问题讨论】:

  • 我可能不在这儿,但你不应该用 $1, $2 替换,因为\1 是在正则表达式中反向引用捕获的组,而是替换表达式,出于所有意图和目的,是新的吗?
  • No $1 和 $2 不起作用。他们将自己作为文字返回,即“$1 $2”。

标签: regex replace sql-server-2008-r2 ssms capturing-group


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    SELECT {.+} FROM {.+}
    

    当您将它与 \1 \2 替换表达式结合使用时,您会得到预期的结果:

    First Table1
    Second Table2
    Third Table3
    

    VS Regex reference page 解释详情。

    【讨论】:

    • 那是什么风格的正则表达式?有参考吗?
    • @roryap 我不知道这种特定风格的正则表达式是否有名称,但我链接的文档页面专门讨论了这种差异:“正则表达式之间存在许多语法差异可用于 Find what and Replace with 以及那些在 .NET Framework 编程中有效的。例如,在 Find and Replace 窗口中,大括号 {} 用于标记要替换的表达式。
    • 知道如何在 SSMS 2016 (13.0.14000.36) 中做同样的事情吗?
    • 出于某种奇怪的原因,在 SSMS 中他们使用 $1 而不是 \1...不确定来自什么正则表达式方言...
    • @Wouter - 公平一点的现有技术做到了这一点,PHP、JavaScript、C#...\1 等在表达式中用于引用捕获(例如,(["']).*?\1 匹配 ""'' 但不匹配 "'),但在 替换模式中,它通常是$1 之类的。
    猜你喜欢
    • 2012-04-13
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多