RegEx для замены текста на основе другого текста в Notepad ++ - PullRequest
2 голосов
/ 12 мая 2019

Может ли notepad ++ заменить текст на основе другого текста в том же файле с помощью регулярных выражений?

Я хотел бы заменить 'HCBANK' на имя таблицы в строке CREATE 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](...

Мне удается захватить правильное имя таблицы, используя

\]\.\[(.*?)\]

Но не уверен, как заменить HCBANK, используя Find In Files (Ctrl + Shift + F) - так как у меня много файлов.

Как мне решить эту проблему?

Ответы [ 2 ]

1 голос
/ 12 мая 2019
  • Ctrl + H
  • Найти что: IF NOT EXISTS \(SELECT \* FROM dbo\.sysobjects where id = object_id\(N'dbo\.\[\K[^]]+(?=]'\) and.+?CREATE TABLE \[[^]]+\]\.\[([^]]+)\])
  • Заменить на: $1
  • check Обтекание
  • check Регулярное выражение
  • CHECK . 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

Снимок экрана:

enter image description here

1 голос
/ 12 мая 2019

Вы можете использовать 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 \[[^]]+\]\.\[([^]]+)\])

В качестве замены используйте $1$3$2

Regex demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...