Использование регулярных выражений для удаления всех GO в файле сценария sql - PullRequest
4 голосов
/ 23 февраля 2012

Я пытаюсь разобрать своего рода большой сценарий SQL, содержащий такие команды, как функции создания и сохранения процедур. Я хочу разделить файл на строки всякий раз, когда нахожу оператор GO (я хочу выполнить его, используя обычный ado.net вместо SMO).

Проблема в том, что я до сих пор не нашел подходящего регулярного выражения для этого. Использование простого \bGO\b игнорирующего регистра разделит его. Но также разделит все ходы внутри комментария как

- этот ход также будет разделен

Использование этого выражения ^\bGO\b[^--]$ почти решает мою проблему, но я получаю некоторую ошибку, когда у меня есть два последовательных GO (которые по какой-либо причине находятся там и находятся за моим доменом).

end
go 
GO 

Вот так выглядит конец создания SP в моем скрипте.

Я делаю это в C #

Большое спасибо

** РЕДАКТИРОВАТЬ **

Сотрудник придумал решение, которое пока работает для всех моих сценариев

^\s*go\s*\r\n

Ответы [ 4 ]

3 голосов
/ 24 февраля 2012

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

(?i-msnx:\b(?<!-{2,}.*)go[^a-zA-Z])

означает, что строка go , если ей не предшествуют 2 или более тире, за которыми следует что-либо.

Это должно сработать!

Отредактировано для принудительной проверки только на границах слов

Отредактировано, чтобы игнорировать 'go', за которым следуют буква / цифры (последняя попытка :)) и добавлена ​​ссылка на инструмент регулярных выражений

PS: Если вы не нашли , то - отличный ресурс о RE.

PS2: Это отличный инструмент для создания / проверки RE

3 голосов
/ 24 февраля 2012

Ну, вы, наверное, уже слышали: «Некоторые люди, сталкиваясь с проблемой, думают:« Я знаю, я буду использовать регулярные выражения. «Теперь у них две проблемы».Если производительность вас не беспокоит, вы можете просто проверить, равна ли обрезанная линия значению «go», игнорируя регистр.Вы не будете тратить больше времени на регулярные выражения.

1 голос
/ 18 января 2017

Я знаю, что это действительно старый вопрос, но, надеюсь, это поможет кому-то еще.

Это регулярное выражение, которое я использую:

(^(go)[\s,;])|(^(go)$)|(;go)|(;)\s*(go)

Я пока не смог его сломать.

Вот тестовый пример, который я использовал:

use SCRATCH  
GO;  
--go  
set nocount ON ;go;  
go  
' go '   
'go'  
'go  
go'  
create table gonogo ( go int null, nogo int null)   
GO  

insert INTO mungbean VALUES (1); go  
GO  
;  
select * from mungbean  
go  

 go  
 go;  
 '  
go  
0 голосов
/ 23 февраля 2012

Может быть проще обработать этот последний случай без регулярных выражений.

После разделения сценария удалите части, для которых String.IsNullOrWhitespace(part) == true

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