用于在 Notepad++ 中基于另一个文本替换文本的正则表达式

RegEx for replacing a text based on another text in Notepad++

notepad++ 可以使用正则表达式替换基于同一文件中其他文本的文本吗?

我想将 'HCBANK' 替换为 CREATE TABLE 行中 table 的名称。

所有文件在同一位置有 'HCBANK'。

例子

文件A.sql

IF NOT EXISTS (SELECT * FROM dbo.sysobjects where id = object_id(N'dbo.[HCBANK]') and OBJECTPROPERTY(id, N'IsTable') = 1)
BEGIN
CREATE TABLE [dbo].[AGEGROUP](...

文件B.sql

IF NOT EXISTS (SELECT * FROM dbo.sysobjects where id = object_id(N'dbo.[HCBANK]') and OBJECTPROPERTY(id, N'IsTable') = 1)
BEGIN
CREATE TABLE [dbo].[HCBLACKLIST](...

等等。

预期结果:

文件A.sql

IF NOT EXISTS (SELECT * FROM dbo.sysobjects where id = object_id(N'dbo.[AGEGROUP]') and OBJECTPROPERTY(id, N'IsTable') = 1)
BEGIN
CREATE TABLE [dbo].[AGEGROUP](...

文件B.sql

IF NOT EXISTS (SELECT * FROM dbo.sysobjects where id = object_id(N'dbo.[HCBLACKLIST]') and OBJECTPROPERTY(id, N'IsTable') = 1)
BEGIN
CREATE TABLE [dbo].[HCBLACKLIST](...

我设法使用

捕获正确的 table 名称
\]\.\[(.*?)\]

但是,不确定如何使用在文件中查找 (Ctrl+Shift+F) 替换 HCBANK - 因为我有很多文件。

我该如何解决这个问题?

您可以使用 3 个捕获组并参考替换中的那些。

这可能是匹配第 21 组中查询的第一部分直到 HCBANK,然后匹配第 2 组中查询的其余部分的示例。

您可以根据需要使匹配尽可能详细,但这将是查找和替换的想法。

(IF NOT EXISTS \(SELECT \* FROM dbo\.sysobjects where id = object_id\(N'dbo\.\[)[^]]+(]'\) and.*(?:\r?\n|\r)BEGIN(?:\r?\n|\r)CREATE TABLE \[[^]]+\]\.\[([^]]+)\])

在替换中使用

Regex demo

  • Ctrl+H
  • 查找内容:IF NOT EXISTS \(SELECT \* FROM dbo\.sysobjects where id = object_id\(N'dbo\.\[\K[^]]+(?=]'\) and.+?CREATE TABLE \[[^]]+\]\.\[([^]]+)\])
  • 替换为:</code></li> <li><em>选中环绕</em></li> <li><em>检查正则表达式</em></li> <li><em>检查 <code>. matches newline
  • 全部替换

解释:

IF NOT EXISTS \(SELECT \* FROM dbo\.sysobjects where id = object_id\(N'dbo\.\[  # literally
\K                                          # forget all we have seen until this position
[^]]+                                       # 1 or more non ]
(?=                                         # start lookahead
  ]'\) and.+?CREATE TABLE \[[^]]+\]\.\[     # literally
  ([^]]+)                                   # group 1, 1 or more non ]
  \]                                        # ]
)                                           # end lookahead

屏幕截图: