Регулярное выражение для одного слова - PullRequest
1 голос
/ 11 марта 2009

Я использую Regex.Split для разделения сценария SQL по ключевому слову «GO». Моя проблема здесь в том, что я не могу понять, как заставить Regex сделать раскол. Мое выражение регулярного выражения также разделяется на «GO», даже если оно в выражении SQL, например:

Insert into  x(a,b) values(‘please go get some text’,’abc’)

Но я хочу, чтобы он разделился только на ключевое слово "GO". Есть предложения?

РЕДАКТИРОВАТЬ: я использую c #. на данный момент мое регулярное выражение просто:

  foreach (string batch in Regex.Split(script, "\\bGO\\b", RegexOptions.IgnoreCase))
  {
    yield return batch;
  }

Ответы [ 5 ]

4 голосов
/ 11 марта 2009

Разделить на GOs на линии, например:

foreach (string batch in Regex.Split(script, "^GO$\\n", RegexOptions.IgnoreCase | RegexOptions.Multiline))
{
    yield return batch;
}

В зависимости от того, откуда идет ваш скрипт, вам может потребоваться изменить его на "^ GO $ \\ r \\ n"

4 голосов
/ 11 марта 2009

Это практически невозможно без реализации полного синтаксического анализатора SQL (что вы, вероятно, не хотите делать), действительно правильным способом.

Альтернативой может быть использование некоторых хаков (то есть игнорирование разделов текста в кавычках), но это все равно не будет работать, если ваш SQL содержит текст 'GO' в другом месте, например, 'SELECT * FROM GO.

3 голосов
/ 11 марта 2009

Вы можете искать «go» в строке отдельно. Не гарантированно всегда работает, но с большей вероятностью работает.

2 голосов
/ 11 марта 2009

Вы можете попробовать что-то вроде

/; \ s GO \ s ; / я

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

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

Имейте в виду, что в случае появления "; GO;" происходит внутри вставляемой строки, тогда невозможно достичь цели без правильного парсера SQL.

0 голосов
/ 14 марта 2011

Вот как я решил это с помощью регулярного выражения.

var statements = Regex.Split(sql, @"^\s*GO\s*$", 
    RegexOptions.IgnoreCase | RegexOptions.Multiline);            

Это разделяется на "GO", когда он находится на своей собственной линии и, возможно, окружен пробелами. Похоже, что это правила, применяемые SSMS - размещение GO в строке с любым другим оператором приводит к ошибке (точка с запятой или нет).

Обратите внимание, что он по-прежнему сломается, если ваш скрипт содержит операторы GO в отдельной строке внутри комментариев блока. Это единственная ошибка, о которой я могу подумать.

Пуленепробиваемым решением будет использование SMO, как подробно описано в этом ответе .

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