Итак, регулярное выражение, которое вы хотите использовать для search , равно:
(CREATE\sNONCLUSTERED\sINDEX\s(.+?)(\sON\s)(.+?))\n\s*(GO)
И регулярное выражение, которое вы хотите использовать для replace , выглядит так:
--$1\n--$5
Я попробовал это на следующем:
CREATE NONCLUSTERED INDEX [Indx_Temp_dboTable1] ON [dbo].[Table1] ( [Id] ASC, [Val] ASC )
GO
CREATE NONCLUSTERED INDEX [Indx_Temp_dboTable2] ON [dbo].[Table2] ( [Id1] ASC )
GO
CREATE NONCLUSTERED INDEX [Indx_Temp_dboTable3] ON [dbo].[Table3] ( [Value1] ASC )
GO
И в результате получил следующее:
--CREATE NONCLUSTERED INDEX [Indx_Temp_dboTable1] ON [dbo].[Table1] ( [Id] ASC, [Val] ASC )
--GO
--CREATE NONCLUSTERED INDEX [Indx_Temp_dboTable2] ON [dbo].[Table2] ( [Id1] ASC )
--GO
--CREATE NONCLUSTERED INDEX [Indx_Temp_dboTable3] ON [dbo].[Table3] ( [Value1] ASC )
--GO
Теперь, ключом к этому является то, что .+
довольно жадный. Поэтому, если вы укажете (.+)STOP
, он не остановится на первом STOP
, который он увидит. Он остановится на последнем доступном. Причина этого в том, что, опять же, это супер жадный.
Таким образом, выполнение .+?
сделает его менее жадным. Следовательно, (.+?)STOP
остановит его на первом STOP
, которое он увидит.
CREATE\sNONCLUSTERED\sINDEX\s
: захватывает то, что вы ожидаете СОЗДАТЬ НЕКЛАСТЕРНЫЙ ИНДЕКС (.+?)(\sON\s)
: захватывает [Indx_Temp_dboTable] ON
Мы используем ON
, чтобы указать, когда заканчивается Index
. (.+?)\n
: захватывает оставшуюся часть строки (до ее окончания ) \s*(GO)
: захватывает пустые строки (*
, поскольку у нас может не быть пустых строк), пока мы не достигнем GO
В случае, если у вас есть дополнительный GO
, тогда нам нужно сделать \s*(GO)
дополнительным. Мы можем сделать это, просто включив его в группу захвата; следовательно, (\s*(GO))
Однако , теперь вам нужно обновить замену. GO
теперь захватывается группой 6, а не 5. Поэтому вам понадобится --$1\n--$6
.
Обратите внимание: строка CREATE
имеет в конце разрыв строки из-за \n
перед захватом пустых строк и GO
.