如何使用捕获组和替换组合用于Notepad ++的多个RegEx命令?

时间:2019-07-04 22:40:14

标签: regex notepad++ regex-group

我正在使用单独的专用转换工具将导出的SQL视图作为文件转换为不同的语法。该工具无法处理某些命令和格式,因此我正在使用带有RegEx的Notepad ++来提前更改文件。

到目前为止,我已经获得了想要的结果,但是需要执行三个单独的“查找/替换”操作。 如果可能的话,我想将这三个RegEx操作减少到一个。

Find: (.*)(CREATE VIEW.*\nGO)(.*)
Replace: \2

Find: (CREATE VIEW )(.*)(\r\nAS)
Replace: \1"\2"\3

Find: (oldschema1\.|\[oldschema1\]\.|\[|\]|TOP \(100\) PERCENT|oldschema2\.)|(^GO$)|(\A^(.*?))
Replace: (?1)(?2\;)(?3SET SCHEMA schemaname\; \n\n\1)```

我使用的是Notepad ++ 7.7.1 64位,使用正则表达式搜索模式查找/替换-选中“。匹配换行符”。

您会在我的代码中看到我已经在交替使用捕获组。我以为我可以将RegEx的前两个步骤作为步骤3的附加捕获组进行组合,但是它没有用,可能是因为它们是嵌套的。

我尝试通过相应增加引用编号来引用嵌套组,但是它不起作用(将结果空白)。

这是示例SQL视图文件。这不是可行的视图,因为我添加了“ oldschema2”,因此RegEx可以为其中的一种替代品找到一些东西,但这在这里仅作为示例。

garbage 
text 
beforehand

CREATE VIEW [oldschema1].[viewname]
AS
SELECT DISTINCT 
                         TOP (100) PERCENT oldschema1.TABLENAME.FIELD1, oldschema1.TABLENAME.FIELD2
FROM            oldschema1.TABLENAME
WHERE        (oldschema1.TABLENAME.FIELD3 = N'Z003') AND oldschema2.TABLENAME.FIELD2 = 1
ORDER BY oldschema1.TABLENAME.FIELD1

GO

garbage 
text
after

以下是我每次尝试要实现的目标的其他一些细节。

Notepad ++ RegEx步骤1-将视图块从CREATE VIEW转到GO

查找: (.*)(CREATE VIEW.*\nGO)(.*)

替换: \2

第2步-在视图名称周围加上引号

查找: (CREATE VIEW )(.*)(\r\nAS)

替换: \1"\2"\3

第3步-删除/替换各种文本,并在文件开头插入一行

查找: (oldschema1\.|\[oldschema1\]\.|\[|\]|TOP \(100\) PERCENT|oldschema2\.)|(^GO$)|(\A^(.*?))

替换: (?1)(?2\;)(?3SET SCHEMA schemaname\; \n\n\1)

以上示例的预期输出为:

SET SCHEMA schemaname;

CREATE VIEW "viewname"
AS
SELECT DISTINCT 
                         TABLENAME.FIELD1, TABLENAME.FIELD2
FROM            TABLENAME
WHERE        (TABLENAME.FIELD3 = N'Z003') AND TABLENAME.FIELD2 = 1
ORDER BY TABLENAME.FIELD1

;

我可以通过上述三个步骤来实现,但是如果可能的话,我想一次查找/替换。

对于RegEx和StackOverflow,我还是一个新手。非常感谢您的帮助。

1 个答案:

答案 0 :(得分:-1)

步骤1

我不太确定,但是我猜测也许我们想要一个类似于以下内容的表达式:

[\s\S]*?(CREATE VIEW[\s\S]*GO\s*)[\s\S]*

要用$1替换,其中我们所需的数据在此捕获组中:

(CREATE VIEW[\s\S]*GO\s*)

我们甚至可以删除\s*

(CREATE VIEW[\s\S]*GO)

然后尝试:

[\s\S]*?(CREATE VIEW[\s\S]*GO)[\s\S]*

,带有m标志。

如果您有兴趣,可以在this demo的右侧面板中进一步解释该表达式。

步骤2

我们可以尝试:

(CREATE VIEW)(.*)

并替换为:

SET SCHEMA schemaname;\n\n$1 "viewname"

Demo

步骤3

此步骤可能使用类似于以下内容的表达式完成:

TOP \(100\) PERCENT |oldschema1\.

被替换为空字符串。

Demo

步骤4:

\s*GO\n;;取代,我们可能有所需的输出,尽管不确定。

Demo