我偶尔使用正则表达式,但我对它们的了解还不够深入。
我在几个文件中都有以下文本:
IF EXISTS (SELECT TOP 1 1 FROM sys.objects WHERE object_id=OBJECT_ID(N'[dbo].[B]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[B]
GO
CREATE PROCEDURE [dbo].[A] ...
每个文件都发生更改,前三行被插入(在文件中替换)。
我想要实现的是让每个文件上的 B 都变成 A。例如:
"blah blah [B] more blah [A1]" => "blah blah [A1] more blah [A1]"
"blah blah [B] more blah [A2]" => "blah blah [A2] more blah [A2]"
...
"blah blah [B] more blah [An]" => "blah blah [An] more blah [An]"
有人知道这是否可行以及如何做到吗?
谢谢。
编辑。我忘了说,上述文本前后还有其他几行代码,每个文件都不一样。这不是文件中唯一的文本。
答案1
您需要一个反向引用:
匹配:
([A-Za-z0-9\s]+) \[\w+\] ([A-Za-z0-9\s]+) (\[\w+\])
代替:
\1 \3 \2 \3
括号捕获其内容,\n 播放它。
[A-Za-z0-9\s]+
应该匹配大多数 SQL 语句,并且\[\w+\]
应该匹配方括号中的位。
答案2
通过使用反向引用和匹配表达式的分解,我得到了一个可行的解决方案,虽然它很大而且很丑,但却能完美地完成工作:
匹配:(IF EXISTS \(SELECT TOP 1 1 FROM sys\.objects WHERE object_id=OBJECT_ID\(N'\[dbo\]\.)(\[\w+\])('\) AND type in \(N'P', N'PC'\)\)\r\n DROP PROCEDURE \[dbo\]\.)(\[\w+\])(\r\nGO\r\nCREATE PROCEDURE \[dbo\]\.)(\[\w+\])
代替:$1$6$3$6$5$6