1

Я случайный пользователь регулярных выражений, и мои знания о них далеко не звездные.

У меня есть следующий текст в нескольких сотнях файлов:

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]"

Кто-нибудь знает, возможно ли это и как это сделать?

Благодарю.

РЕДАКТИРОВАТЬ. Я забыл сказать, что до и после вышеприведенного текста есть другие строки кода, переменные для каждого файла. Это не единственный текст в файлах.

2 ответа2

0

Вам понадобится обратная ссылка:

Совпадение:([A-Za-z0-9\s]+) \[\w+\] ([A-Za-z0-9\s]+) (\[\w+\])

Заменить:\1 \3 \2 \3

Скобки захватывают их содержимое, \n воспроизводят его. [A-Za-z0-9\s]+ должно соответствовать большинству ваших операторов SQL, а \[\w+\] должно соответствовать битам в квадратных скобках.

0

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

Соответствие: (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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .