Как объединить несколько команд RegEx для Notepad ++, используя группы захвата и чередования? - PullRequest
2 голосов
/ 05 июля 2019

Я конвертирую экспортированные представления SQL в виде файлов в другой синтаксис, используя отдельный специализированный инструмент преобразования.Этот инструмент не может обрабатывать определенные команды и форматирование, поэтому я использую Notepad ++ с RegEx для заблаговременного изменения файлов.

Пока я получаю нужные результаты, но для этого требуется три отдельных Find /Заменить действия. Я бы хотел сократить эти три действия 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)```

Я использую 64-битную версию Notepad ++ 7.7.1, поиск / замена с поиском по регулярным выражениямmode - проверка ". соответствует символу новой строки".

В моем коде вы увидите, что я уже использую группы перехвата с чередованием.Я думал, что смогу объединить первые два шага 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

Вот некоторые дополнительные детали того, что япытаюсь достичь с каждым проходом.

Блокнот ++ 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 голосов
/ 05 июля 2019

Шаг 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.

На правой панели этой демонстрации это выражение дополнительно объяснено, если вам может быть интересно.

Шаг 2

Мы можем попробовать:

(CREATE VIEW)(.*)

и заменить на:

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

Демо

Шаг 3

Этот шаг, вероятно, будет выполнен с помощью выражения, похожего на:

TOP \(100\) PERCENT |oldschema1\.

заменяется пустой строкой.

Демо

Шаг 4:

\s*GO заменяется \n; или просто ;, и мы, вероятно, получим желаемый результат, хотя и не уверены.

Демо

...