Регулярное выражение для сопоставления строк в кавычках с отрицательным просмотром назад (.NET)

Я пытаюсь создать регулярное выражение .NET, которое будет соответствовать строкам в кавычках в исходном коде VB.NET, но исключая некоторые нежелательные строки, такие как строки в комментариях XML, метки регионов и т. д.

Вот образец данных, представляющий некоторый исходный код 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

Regex должен соответствовать строке в кавычках в вызове метода Debug.WriteLine, но должен игнорировать строку в метке региона и комментарий XML. Он также должен поддерживать синтаксис экранирования кавычек VB.NET, который использует две последовательные двойные кавычки для представления встроенного (экранированного) символа кавычки:

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

В качестве отправной точки я поэкспериментировал со следующим регулярным выражением, но отрицательный просмотр назад заставляет его сопоставлять последующие закрывающие кавычки, как если бы они были открывающими кавычками.

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

В качестве дополнительной тонкости было бы полезно, если бы регулярное выражение могло полностью игнорировать пустые строки, представленные парой символов кавычек.

Любые предложения, пожалуйста?

Заранее спасибо, Тим


person Tim Coulter    schedule 25.05.2011    source источник


Ответы (1)


Я думаю, что это один из тех случаев, когда одно регулярное выражение не решит всех ваших проблем. Я предполагаю, что директивы #Region могут быть многострочными, например:

#Region \
  "MyRegion"

или, может быть, с каким-то другим символом разрыва строки, поэтому вашего просмотра назад недостаточно. Для выборочного извлечения совпадений из текста со сложным синтаксисом требуется лексер, или, возможно, вам следует проанализировать все это по-другому. Однако вы можете найти ярлык, например, вы знаете, что вам ничего не нужно между тегами ‹summary› и ‹/summary›, поэтому вы можете перебирать каждую строку и пропускать все, что находится после ‹summary›, пока не найдете закрывающий тег, затем вы можете возобновить сопоставление строк. Вы должны уделять особое внимание написанию регулярного выражения, чтобы убрать комментарии и директивы препроцессора (например: ', # и REM). Обратите внимание, что все эти ключевые слова действительны, когда они не находятся в строке, поэтому удаление комментариев требует некоторых усилий. Даже там одного регулярного выражения может быть недостаточно. Для удаления двойных кавычек это, кажется, помогает мне:

"((?:[^"]|"")+)"
person King_DuckZ    schedule 25.05.2011
comment
Спасибо за Ваш ответ. Вы правы, это сложнее, чем я себе представлял, но ваше предложение о тегах ‹summary› дало мне полезную подсказку, которую, я думаю, я могу заставить работать. Вероятно, я могу использовать ту же технику для сопоставления всех строк, которые я хочу исключить, но захватить только тот случай, который содержит нужные мне литералы. - person Tim Coulter; 25.05.2011