0

正規表現を使用して一致させようとしている次のテキストがあります。

PRINT CONVERT(NVARCHAR, CURRENT_TIMESTAMP, 111) + ' ' + CONVERT(NVARCHAR, CURRENT_TIMESTAMP, 108) + ' -Test Mode : ' + (CASE WHEN @turbo_mode_ind = 1 THEN 'some text ''test'' some more text.' ELSE 'およびさらに多くのテキスト ''temp'' いつ停止しますか?' END)

PRINT 'text don''not text'

PRINT 'テキスト ''test2'' テキスト'

私が一致させたいのは:

PRINT CONVERT(NVARCHAR, CURRENT_TIMESTAMP, 111) + ' ' + CONVERT(NVARCHAR, CURRENT_TIMESTAMP, 108) + ' -Test Mode : ' + (CASE WHEN @turbo_mode_ind = 1 THEN 'some text ''test''

PRINT 'テキスト''test2''

だから基本的に私は一致したい:

  • PRINTから始まる
  • PRINT (.*) の後に続く各文字
  • 改行を含む (改行で止めないでください)
  • 一致の最後に \'{2}\w+\'{2} を使用
  • 非貪欲 (.*?)
  • AND PRINT と \'{2}\w+\'{2} の間に空行がない

私はすでにこれを作成しましたが、それでも空の行に一致します:

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

4

1 に答える 1

0

コメント後に編集:

要件をもう一度見てみると、単一の正規表現ソリューションをすぐに思いつくことができませんでした。あなたのコメントでは、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);
}  

これでうまくいくはずですが、コードはテストしていません。

これが役立つことを願っています。

于 2009-11-26T12:19:16.947 に答える