Регулярное выражение для получения комментариев в исходном коде VB.Net - PullRequest
3 голосов
/ 23 ноября 2008

У меня есть функция подсветки синтаксиса в vb.net. Я использую регулярные выражения, например, для соответствия "! IF", а затем окрашиваю его в синий цвет. Это прекрасно работает, пока я не попытался выяснить, как делать комментарии.

Язык, который я пишу для комментария, может быть либо, если строка начинается с одинарной кавычки 'ИЛИ, если где-нибудь в строке есть две одинарные кавычки

'this line is a comment
!if StackOverflow = "AWESOME" ''this is also a comment

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

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

    For Each pass In frmColors.lbRegExps.Items
        RegExp = System.Text.RegularExpressions.Regex.Matches(LCase(rtbMain.Text), LCase(pass))
        For Each RegExpMatch In RegExp
            rtbMain.Select(RegExpMatch.Index, RegExpMatch.Length)
            rtbMain.SelectionColor = ColorTranslator.FromHtml(frmColors.lbHexColors.Items(PassNumber))
        Next
        PassNumber += 1
    Next

Ответы [ 3 ]

8 голосов
/ 23 ноября 2008

Что-то вроде:

^(\'[^\r\n]+)$|(''[^\r\n]+)$

должен дать вам закомментированную строку (части строки) в группе n ° 1

На самом деле, вам даже не нужна группа

^\'[^\r\n]+$|''[^\r\n]+$

Если он что-то находит, это комментарий.

"(^'|'').*$"

упомянутый Боазом будет работать, если применять только построчно (что может быть вашим случаем).
Для многострочного обнаружения вы должны обязательно избегать режима «Dotall», где «.» также обозначает \ r и \ n символов. В противном случае этот шаблон будет полностью соответствовать обеим вашим линиям.

Именно поэтому я обычно предпочитаю [^\r\n] вместо '.': Это позволяет избежать какой-либо зависимости от режима паттерна. Даже в режиме «Dotall» он все еще работает и избегает попыток совпадения на следующей строке.

1 голос
/ 23 ноября 2008

Хотя вышеприведенное сработает, вы можете упростить его:

"(^'|'').*$"

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

"(^'|'').*?$"

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

0 голосов
/ 29 июня 2016

Использование шаблона регулярного выражения: REM ((\ t |). * $ | $) | ^ \ '[^ \ R \ n] + $ |' '[^ \ r \ n] + $

подробнее https://code.msdn.microsoft.com/How-to-find-code-comments-9d1f7a29/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...