Регулярное выражение для сопоставления строк в кавычках с отрицательным внешним видом (.NET) - PullRequest
1 голос
/ 25 мая 2011

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

Вот данныеобразец, представляющий некоторый исходный код VB.NET, который может выполнять Regex:

#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>(?:[^"]|"")*)"

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

Есть предложения, пожалуйста?

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

1 Ответ

1 голос
/ 25 мая 2011

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

#Region \
  "MyRegion"

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

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

"((?:[^"]|"")+)"
...