2

私は専門家ではありませんが、SQLコメント行を除外するために.NET正規表現を記述しようとしています。残念ながら、除外グループを使用して別の正規表現の一致で正規表現の一致を見つける方法の適切な説明を見つけることができません:('。*?')。

この正規表現は、引用符で囲まれたすべてのテキストを検索しますが、SQLコメント領域(/*..*/および-..)も含まれます。

'.*?'

私が試したすべてが期待どおりに機能しません。

私のテストサンプル:

    IF @RetValue = 'Cat'
   /*SET @RetValue = 'WrongLocation
and it works here' */
   ------testing line
SET @Dude = 'Punto'
/* comments */
    -- But it doesn't work here because inside comments! 
    -- and this is aren't the end
    SET @RetValue = 'But this should
work here'

正しい一致はこれだけを返す必要があります:

'Cat'
''Punto'
and
'But this should
work here'
4

1 に答える 1

0

エレガントな正規表現を1つのステップで実行することはできませんが、2つのステップで実行できます。

string commentFree = Regex.Replace(sourceString, @"\/\*.*?\*\/|\-\-[^\n]*\n", string.Empty, RegexOptions.Multiline | RegexOptions.Singleline);

これで、commentFree'[^']*'でRegExを実行して、フィールドを抽出できます。

これは、RegExエンジンをバックトラックする必要がないため、'[^']*'より効率的であることに注意してください。'.*?'これで、開始引用符が見つかり、それ自体が引用符ではないすべての文字について続行し、終了引用符で終了します。上記と同じ手法を使用して--、行の終わりまでコメントを取得し\nます。

編集: あるいは、パターンを使用してすべてのコメントと引用ブロック(コメント内にない)を一致させ、結果を反復処理するときに\/\*.*?\*\/|\-\-[^\n]*\n|'[^']*'始まる一致のみを使用することができます。これらは引用ブロックになります。'

于 2012-05-11T17:43:39.253 に答える