Regex: сопоставить блоки SQL PRINT с текстом в кавычках - PullRequest
0 голосов
/ 26 ноября 2009

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

PRINT CONVERT (NVARCHAR, CURRENT_TIMESTAMP, 111) + '' + CONVERT (NVARCHAR, CURRENT_TIMESTAMP, 108) + '-Test Mode:' + (CASE WHEN @turbo_mode_ind = 1 ТО 'некоторый текст' 'тест' 'еще немного текста.' ELSE 'и даже больше текста' 'temp' 'когда это остановится? END)

ПЕЧАТЬ 'текст не текст'

ПЕЧАТЬ 'text' 'test2' 'text'

То, что я хочу сопоставить:

PRINT CONVERT (NVARCHAR, CURRENT_TIMESTAMP, 111) + '' + CONVERT (NVARCHAR, CURRENT_TIMESTAMP, 108) + '-Test Mode:' + (CASE WHEN @turbo_mode_ind = 1 ТО 'некоторый текст' 'тест' '

ПЕЧАТЬ 'text' 'test2' '

Так что в основном я хочу соответствовать:

  • начиная с PRINT
  • каждый символ после PRINT (. *)
  • включительно разрывы строки (не останавливайтесь на линия-брейки)
  • с \ '{2} \ w + \' {2} в конце матч
  • не жадный (. *?)
  • И нет пустых строк между PRINT и \ '{2} \ w + \' {2}

Я уже написал это, но он все еще соответствует пустой строке (ям):

PRINT.*?\'{2}\w+\'{2}(?!\n\s*\n)

1 Ответ

0 голосов
/ 26 ноября 2009

Изменить после комментария:

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

Возможное решение состоит в том, чтобы сначала разбить строку на пустые строки, а затем извлечь текст.

Примерно так:

string pattern = @"^$";

foreach (string result in Regex.Split(input, pattern, RegexOptions.Multiline) 
{
    Regex rxFindSql = Regex(@"PRINT.*?\'{2}\w+?\'{2}", RegexOptions.SingleLine)       
    MatchCollection matches = rxFindSql.Matches(result);
}  

Это должно сработать, но я не тестировал код.

Надеюсь, это поможет.

...