1

VB.NET ソース コードの引用符で囲まれた文字列に一致する .NET Regex を作成しようとしていますが、XML コメントの文字列やリージョン ラベルなどの特定の不要な文字列を除外しています。

以下は、Regex が実行される可能性のある VB.NET ソース コードを表すデータ サンプルです。

#Region "Class Constructors"

''' <summary>
''' Initializes a new instance of the <see cref="MyClass" /> class.
''' </summary>
Public Sub New()
    Debug.WriteLine("This string should be matched by the Regex")
End Sub

#End Region

正規表現は、メソッド呼び出しで引用符で囲まれた文字列と一致するDebug.WriteLine必要がありますが、領域ラベルと XML コメントの文字列は無視する必要があります。また、2 つの連続する二重引用符を使用して、埋め込まれた (エスケープされた) 引用符文字を表す VB.NET の引用符エスケープ構文もサポートする必要があります。

"This is a string containing an escaped quote "" character"

出発点として、次の正規表現を試してみましたが、否定の後読みにより、開始引用符であるかのように後続の終了引用符に一致します。

(?<!Region\s+)"(?<Literal>(?:[^"]|"")*)"

追加のフィネスとして、正規表現が引用符のペアで表される空の文字列を完全に無視できると便利です。

何か提案はありますか?

前もってありがとう、ティム

4

1 に答える 1

1

これは、単一の正規表現ではすべての問題を解決できないケースの 1 つだと思います。#Region ディレクティブは、次のように複数行にできると想定しています。

#Region \
  "MyRegion"

または、他の改行文字を使用している可能性があるため、後読みではまったく十分ではありません。複雑な構文を持つテキストから選択的に一致を抽出するには、レクサーが必要です。または、全体を別の方法で解析する必要があるかもしれません。ただし、ショートカットを見つけることができる場合があります。たとえば、タグ <summary> と </summary> の間に何も必要ないことがわかっている場合は、各行をループして <summary> を超えるすべてをスキップすることができます。終了タグを使用すると、文字列の照合を再開できます。コメントとプリプロセッサ ディレクティブ (つまり、'、#、および REM) を削除するために、正規表現を記述する際には特別な注意を払う必要があります。これらのキーワードは、文字列に含まれていない場合はすべて有効であるため、コメントの削除が少し複雑になることに注意してください。それでも、単一の正規表現では不十分な場合があります。二重引用符を削除するには、

"((?:[^"]|"")+)"
于 2011-05-25T10:42:23.027 に答える