gpt4 book ai didi

regex - Visual Studio regex 使用宏删除 VB.NET 代码中的所有注释和空行

转载 作者:行者123 更新时间:2023-12-04 23:27:56 28 4
gpt4 key购买 nike

我试图在宏的帮助下删除文件中的所有注释和空行。现在我想出了这个删除评论的解决方案(下面描述了一些错误)但无法删除中间的空行 -

Sub CleanCode()
Dim regexComment As String = "(REM [\d\D]*?[\r\n])|(?<SL>\'[\d\D]*?[\r\n])"
Dim regexBlank As String = "^[\s|\t]*$\n"
Dim replace As String = ""

Dim selection As EnvDTE.TextSelection = DTE.ActiveDocument.Selection
Dim editPoint As EnvDTE.EditPoint

selection.StartOfDocument()
selection.EndOfDocument(True)

DTE.UndoContext.Open("Custom regex replace")
Try
Dim content As String = selection.Text
Dim resultComment As String = System.Text.RegularExpressions.Regex.Replace(content, regexComment, replace)
Dim resultBlank As String = System.Text.RegularExpressions.Regex.Replace(resultComment, regexBlank, replace)
selection.Delete()
selection.Collapse()
Dim ed As EditPoint = selection.TopPoint.CreateEditPoint()
ed.Insert(resultBlank)
Catch ex As Exception
DTE.StatusBar.Text = "Regex Find/Replace could not complete"
Finally
DTE.UndoContext.Close()
DTE.StatusBar.Text = "Regex Find/Replace complete"
End Try
End Sub

所以,这是运行宏之前和之后的样子。

之前

Public Class Class1
Public Sub New()
''asdasdas
Dim a As String = "" ''asdasd
''' asd ad asd
End Sub


Public Sub New(ByVal strg As String)

Dim a As String = ""

End Sub


End Class



Public Class Class1
Public Sub New()
Dim a As String = ""
End Sub
Public Sub New(ByVal strg As String)
Dim a As String = ""
End Sub
End Class

宏主要有两个主要问题
  • 它不能删除中间的空行。
  • 如果有一段代码是这样的


  • Dim a as String = "Name='Soham'"

    然后运行宏后它变成

    Dim a as String = "Name='"

    最佳答案

    要摆脱包含空格或不包含任何内容的行,您可以使用此正则表达式:

    (?m)^[ \t]*[\r\n]+

    您的正则表达式, ^[\s|\t]*$\n如果您指定了多行模式( (?m) ),它将起作用,但它仍然不正确。一方面, |匹配文字 | ;无需在字符类中指定“或”。另一个, \s匹配任何空白字符,包括制表符 ( \t )、回车符 ( \r ) 和换行符 ( \n ),使其不必要地冗余和低效。例如,在第一个空行(在第一个 Sub 结束之后), ^[\s|\t]*最初将尝试匹配单词 Public 之前的所有内容,然后它将退回到上一行的末尾,即 $\n可以匹配。

    但是,空行除了空行或仅包含水平空白(空格或制表符)之外,还可能包含注释。我选择将这些“仅注释”行视为空行,因为这样做相对容易,并且简化了在非空行中匹配注释的任务,这要困难得多。这是我的正则表达式:

    ^[ \t]*(?:(?:REM|')[^\r\n]*)?[\r\n]+

    在消耗任何领先的水平空白后,如果我看到 REM'表示评论,我使用它以及它之后的所有内容,直到下一行分隔符。请注意,唯一需要出现的是行分隔符本身。还要注意没有末端 anchor , $ .当您明确匹配行分隔符时,从来没有必要使用它,在这种情况下,它会破坏正则表达式。在多行模式下, $仅在换行符 ( \n ) 之前匹配,而不在回车符 ( \r ) 之前匹配。 (.NET 风格的这种行为是 incorrect 并且相当令人惊讶,因为 Microsoft 长期以来倾向于将 \r\n 作为行分隔符。)

    匹配剩余的评论是一项根本不同的任务。正如您所发现的,只需搜索 REM'不好,因为您可能会在字符串文字中找到它,它并不表示注释的开始。您需要做的是从行的开头开始,消费和捕获不是注释或字符串文字开头的任何内容。如果发现双引号,请继续使用字符串文字。如果您发现 REM' ,停止捕获并继续消耗该行的其余部分。然后用捕获的部分替换整行 - 即评论之前的所有内容。这是正则表达式:

    (?mn)^(?<line>[^\r\n"R']*(("[^"]*"|(?!REM)R)[^\r\n"R']*)*)(REM|')[^\r\n]*

    或者,更易读:

    (?mn)             # Multiline and ExplicitCapture modes
    ^ # beginning of line
    (?<line> # capture in group "line"
    [^\r\n"R']* # any number of "safe" characters
    (
    (
    "[^"]*" # a string literal
    |
    (?!REM)R # 'R' if it's not the beginning of 'REM'
    )
    [^\r\n"R']* # more "safe" characters
    )*
    ) # stop capturing
    (?:REM|') # a comment sigil
    [^\r\n]* # consume the rest of the line

    替换字符串将是 "${line}" .其他一些注意事项:
  • 请注意,此正则表达式不以 [\r\n]+ 结尾使用行分隔符,就像“空白行”正则表达式一样。
  • 它不以 $ 结尾或者,出于与以前相同的原因。 [^\r\n]*将贪婪地消耗行分隔符之前的所有内容,因此不需要 anchor 。
  • 唯一需要提供的是 REM' ;我们不会费心匹配任何不包含注释的行。
  • ExplicitCapture 模式意味着我可以使用 (...)而不是 (?:...)对于我不想捕获的所有组,但命名组,(?<line>...) ,仍然有效。
  • 虽然很粗糙,但如果 VB 支持多行注释,或者它的字符串文字支持反斜杠转义,这个正则表达式会更糟糕。

  • 我不做VB,但 here's a demo in C# .

    关于regex - Visual Studio regex 使用宏删除 VB.NET 代码中的所有注释和空行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9511510/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com