Soh*_*pta 4 regex comments replace visual-studio
我试图在宏的帮助下删除文件中的所有注释和空行.现在我想出了这个删除注释的解决方案(下面描述了一些错误),但是无法删除之间的空白行 -
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
Run Code Online (Sandbox Code Playgroud)
所以,这是运行宏之前和之后的样子.
之前
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
Run Code Online (Sandbox Code Playgroud)
后
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
Run Code Online (Sandbox Code Playgroud)
宏主要存在两个主要问题
Dim a as String = "Name='Soham'"
Run Code Online (Sandbox Code Playgroud)
然后在运行宏之后就变成了
Dim a as String = "Name='"
Run Code Online (Sandbox Code Playgroud)
要删除包含空格或无任何内容的行,可以使用此正则表达式:
(?m)^[ \t]*[\r\n]+
Run Code Online (Sandbox Code Playgroud)
你的正则表达式,^[\s|\t]*$\n如果你指定了多线模式((?m)),它会工作,但它仍然是不正确的.一方面,|匹配文字|; 没有必要在字符类中指定"或".另一方面,\s匹配任何空白字符,包括TAB(\t),carriage-return(\r)和linefeed(\n),这使得它不必要地冗余和低效.例如,在第一个空白行(在第一个空白行结束之后Sub),^[\s|\t]*最初将尝试匹配单词之前的所有内容Public,然后它将返回到前一行的末尾,其中$\n可以匹配.
但是空行除了是空的或仅包含水平空格(空格或TAB)之外,还可以包含注释.我选择将这些"仅注释"行视为空行,因为它相对容易,并且它简化了在非空行中匹配注释的任务,这要困难得多.这是我的正则表达式:
^[ \t]*(?:(?:REM|')[^\r\n]*)?[\r\n]+
Run Code Online (Sandbox Code Playgroud)
在使用任何前导水平空格后,如果我看到REM或'表示注释,我会消耗它以及之后的所有内容直到下一行分隔符.请注意,唯一需要出现的是行分隔符本身.还要注意没有端锚,$.当您明确匹配行分隔符时,永远不必使用它,在这种情况下,它会破坏正则表达式.在多行模式下,$仅在换行符(\n)之前匹配,而不是在回车符()之前匹配\r.(这种.NET风格的行为是不正确的,而且相当令人惊讶,因为微软长期以来一直倾向于\r\n作为行分隔符.)
匹配剩余的评论是一项根本不同的任务.正如您所发现的,只是搜索REM或'不好,因为您可能会在字符串文字中找到它,而这并不表示评论的开始.你要做的就是从行的开头开始,消费和捕获任何不是注释开头或字符串文字的内容.如果您找到双引号,请继续使用字符串文字.如果你找到一个REM或',停止捕获并继续使用其余部分.然后用刚捕获的部分替换整行 - 即评论前的所有内容.这是正则表达式:
(?mn)^(?<line>[^\r\n"R']*(("[^"]*"|(?!REM)R)[^\r\n"R']*)*)(REM|')[^\r\n]*
Run Code Online (Sandbox Code Playgroud)
或者,更可读:
(?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
Run Code Online (Sandbox Code Playgroud)
替换字符串将是"${line}".其他一些说明:
[\r\n]+消耗线分离器,如"空白行"的正则表达式一样.$由于与以前相同的原因,它也不会以任何一种结束.该[^\r\n]*会贪婪地消耗行分隔符之前的一切,所以不需要锚.REMor '; 我们不打扰匹配任何不包含注释的行.(...)而不是(?:...)所有我不想捕获的组,但命名组(?<line>...)仍然有效.我不做VB,但这是C#的演示.