Одна или несколько строк RegEx Find + Replace в Visual Studio - PullRequest
2 голосов
/ 17 января 2020

Критерии поиска:

Попытка найти и заменить одну или несколько заполненных строк смесью текста c и динамического c (могут быть пустые строки или строки) просто между пробелами между двумя строками кода c).

Например, я хочу найти каждый экземпляр следующих 2 заполненных строк кода и заменить его на «-», добавленный перед обоими линии

CREATE NONCLUSTERED INDEX <dynamic index name> ON <dynamic table name> ( <dynamic list of columns > )
GO

или просто одна строка кода (обратите внимание, что нет следующих "GO")

CREATE NONCLUSTERED INDEX <dynamic index name> ON <dynamic table name> ( <dynamic list of columns > )

Пример:

Правильное регулярное выражение должно найти следующий

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 )
<empty line>
GO
CREATE NONCLUSTERED INDEX [Indx_Temp_dboTable3] ON [dbo].[Table3] ( [Value1] ASC )
<empty line>
  <empty line with some spaces>
GO
CREATE NONCLUSTERED INDEX [Indx_Temp_dboTable4] ON [dbo].[Table4] ( [Value1] ASC )

и заменить его на

--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 )
<empty line>
--GO
--CREATE NONCLUSTERED INDEX [Indx_Temp_dboTable3] ON [dbo].[Table3] ( [Value1] ASC )
--<empty line>
--  <empty line with some spaces>
--GO
--CREATE NONCLUSTERED INDEX [Indx_Temp_dboTable4] ON [dbo].[Table4] ( [Value1] ASC )

Когда есть последующий "GO", тогда, если есть способ удалить пустые строки или пустые строки с пробелами между ними первая и вторая строки, это будет здорово если существует. Я НЕ хочу, чтобы регулярное выражение находило и заменяло все, от "создания некластеризованного ..." до последнего "GO" в каждом файле.

Моя попытка

CREATE NONCLUSTERED INDEX .* ON .* ( .* )(.*\n)[GO]

Необходимо исключить 1 или более пустых строк или 1 или более пустых строк с пробелами между двумя строками, если существует последующий GO.

1 Ответ

2 голосов
/ 17 января 2020

Итак, регулярное выражение, которое вы хотите использовать для 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.

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