VB.Net源代码中获取注释的正则表达式

3
我在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

大致意思是:

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

应该将注释行(部分行)放在第n组中

实际上,您甚至不需要组

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

如果发现了什么,那就是一条注释。
"(^'|'').*$"

如果只逐行应用(这可能是您的情况),那么 Boaz 提到的方法可以起作用。

对于多行检测,您必须确保避免使用“Dotall”模式,其中“.”也代表 \r 和 \n 字符。否则,该模式将完全匹配您的两行。

这就是为什么我通常更喜欢使用 [^\r\n] 而不是 '.':它避免了对模式模式的任何依赖。即使在“Dotall”模式下,它仍然有效,并避免尝试在下一行上进行任何匹配。


1

虽然上述方法可以工作,但你可以简化它:

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

正如VonC所提到的-只有在您逐行提供正则表达式时,它才能起作用。对于多行模式,请使用:
"(^'|'').*?$"

问号使星号操作符不贪婪,强制正则表达式匹配单行。


只有逐行应用它才有效。如果应用于多行,由于 '*' 是贪婪量词,你的 '.' 会跨越行匹配第二行的注释而不是第一行的注释。 - VonC

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接