2012-05-09 12 views
2

私は専門家ではありませんが、.NETの正規表現を使用してSQLコメント行を除外しようとしています。残念ながら、除外グループを使用して別の正規表現マッチで正規表現マッチを見つける方法についての適切な記述を見つけることができません:( '。*?')。私はそれを試してみましたC#.NET Regex:除外付きグループ式の作成に役立つ

'.*?' 

すべてが動作しません、私は期待していて: - (.. /*..*/と)

この正規表現は引用符の間のすべてのテキストを検索しますが、それはまた、SQLのコメント領域を含み。

私のテストサンプル

:私はあなたがワンステップでやりたいエレガントな正規表現を見つけることができませんが、あなたが行うことができます

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

答えて

0

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' 

正しいマッチはこれだけを返す必要がありますそれは2つのステップで。

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

今すぐあなたのフィールドを抽出するためにcommentFreeに正規表現'[^']*'を実行することができます。

'[^']*'は、RegExエンジンがバックトラックする必要がなくなるため、'.*?'より効率的です。今すぐ開始見積もりを見つけ、それ自体が見積もりではないすべての文字を続行し、終了見積もりで終了します。 --の後にコメントの最後まで同じ技法を使用します。

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

+0

私が期待しているように、あなたが提供したパターンは例では機能しませんので、まだデータの処理をさらに必要とするため、コメントをスペースに置き換える必要があります。これは今のところ最良の解決策です。今はもっと良いパターンを提供していますし、私が持っているものもいくつかの問題があります。 – btomas

関連する問題