Visual Studio 正则表达式使用宏删除 VB.NET 代码中的所有注释和空行

2023-12-01

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

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

因此,这是运行宏之前和之后的样子。

BEFORE

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

AFTER

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匹配任何空白字符,包括 TAB (\t), 回车符 (\r) 和换行符 (\n),使其不必要地冗余且效率低下。例如,在第一个空行处(在第一个空行结束之后)Sub), the ^[\s|\t]*最初会尝试匹配该单词之前的所有内容Public,然后它将退回到上一行的末尾,其中$\n可以匹配。

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

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

在消耗任何前导水平空白后,如果我看到REM or '表示注释,我会使用它及其后面的所有内容,直到下一个行分隔符。请注意,唯一需要出现的是行分隔符本身。另请注意末端锚点的缺失,$。当您显式匹配行分隔符时,没有必要使用它,在这种情况下,它会破坏正则表达式。在多行模式下,$仅在换行符之前匹配 (\n),不在回车符之前 (\r)。 (.NET 风格的这种行为是不正确考虑到微软长期以来对\r\n作为行分隔符。)

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

(?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}"。其他一些注意事项:

  • 请注意,这个正则表达式确实not结束于[\r\n]+消耗行分隔符,就像“空行”正则表达式一样。
  • 它并没有结束于$要么,出于与之前相同的原因。这[^\r\n]*将贪婪地消耗行分隔符之前的所有内容,因此不需要锚点。
  • 唯一需要出现的是REM or ';我们不会去匹配任何不包含注释的行。
  • ExplicitCapture 模式意味着我可以使用(...)代替(?:...)对于我不想捕获的所有组,但指定的组,(?<line>...),仍然有效。
  • 尽管很粗糙,但如果 VB 支持多行注释,或其字符串文字支持反斜杠转义,则该正则表达式会变得更糟。

我不会VB,但是这是一个 C# 演示.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Visual Studio 正则表达式使用宏删除 VB.NET 代码中的所有注释和空行 的相关文章

  • 如何根据“配置管理器”创建自己定义的常量?

    当我选择 调试 配置时 DEBUG常数处于活动状态 当我选择 释放 配置时 DEBUG常量处于非活动状态 我如何创建自己的配置 以便它们包含我自己定义的常量 基本上 我想要这样 如果我选择配置 FOOBAR 就会有一个常量FOO and B
  • .NET 字符串.替换

    我很生气 通常 我喜欢像 C 中那样进行替换 但是是否有一种 C 风格的替换 它一次仅替换一个字母或我指定的 X 数量 不 BCL 中不存在仅替换字符的单个实例的 Replace 方法 两个主要的 Replace 方法将替换所有出现的情况
  • 正则表达式获取包含某些字符但不包含其他字符的单词

    我想要的是一个正则表达式 它可以获取包含例如字符的单词a并且不包含字符b and c 在我看来 以下内容完成了一半的工作 bc 但我想要言语 并含有a这里不考虑 使用消极的前瞻性 确保我们要捕获的单词没有b nor c 然后 匹配该单词是否
  • 防止字符串中出现西里尔文/希腊文/中文 - C# 4.0

    我们有一个支持希腊语 西里尔语 中文字符的系统 使用 ASP NET C 4 0 但第三方系统似乎无法正常工作 为了避免为此第三方系统输入数据时出现问题 我想将文本字段限制为仅接受英语或重音字符 但返回其他字符的验证错误 我怎样才能做到这一
  • 在elasticsearch中转义特殊字符

    我正在使用Elasticsearch python 客户端 https elasticsearch py readthedocs io en master 对我们托管的 elasticsearch 实例进行一些查询 我注意到一些字符需要转义
  • 在 Greasemonkey @include 中使用正则表达式?

    我想更好地指定 Greasemonkey 脚本的运行位置 include https example com 工作正常 但它太不准确 我想要这样的东西 include https example com xx xx Asset xx 可以是
  • 正则表达式可以与 C++ 中的字符数组一起使用吗

    我正在开发一个无法使用字符串库文件的程序 而是使用字符数组 我能够使用正则表达式 并且想知道是否有办法使用正则表达式和字符数组 甚至正则表达式和单个字符 我问的原因是当我尝试在匹配中使用我的 char 数组时 xUtility 会抛出一堆来
  • 参考新 CSPROJ 格式的 GAC 程序集?

    我使用的是 Visual Studio 2019 预览版 2 1 我有一个 NET Framework 4 6 1 类库 C 项目 其中有一些采用旧 csproj 项目格式 ToolsVersion 15 0 的 Azure 引用 这个旧的
  • Visual Studio:如何将图像资源存储为嵌入式资源?

    默认情况下 当您将图像 图标 位图等 作为资源添加到项目中时 该图像的构建行动被设定为None 这样做是因为图像神奇地存储在 resources 文件中 I希望将资源存储为嵌入式资源 我的原因无关紧要 但让我们假装这样我可以在里面看到它们R
  • 当找到匹配时使用 sed 替换行首

    我有一个 Java 文件 我想注释包含匹配的任何代码行 myvar 我认为 sed 应该在这里帮助我 sed s myVar not sure what to put here g MyFile java 我不知道要输入什么 not sur
  • 根据列中的部分字符串匹配选择数据框行

    我想根据列中字符串的部分匹配从数据框中选择行 例如列 x 包含字符串 hsa 使用sqldf if它有一个like语法 我会做类似的事情 select from lt gt where x like hsa 很遗憾 sqldf不支持该语法
  • 在属性上方显示 CodeLens [重复]

    这个问题在这里已经有答案了 在字段和字段属性之间看到 codelens 引用是非常烦人的 它需要在周围添加很多额外的空格以使所有内容都可读 是否可以在属性上方显示 CodeLens 参考 不 目前这是不可能的 如果您想看到这个 我建议您向产
  • COM多线程支持

    第一次使用COM我有这个 COM dll 比如 ABCServer dll 我创建了一个 RCW 并在我的项目中添加了对它的引用 现在 我的应用程序创建了多个线程 每个线程从 COM dll 创建某些类并使用它们 但是 当其他线程正在处理
  • 从具有多行记录的文件中提取数据,将每个范围保存到单独的文件中

    我有一个看起来像这样的文件 TRANSACTION STARTED 020t CARD INSERTED 020tCARD 5845 DATE 01 02 16 TIME 05 45 52 05 46 26 GENAC 1 ARQC EXT
  • [\b] 退格正则表达式有什么用?

    b 显然匹配退格字符 我无法理解字符串如何包含退格字符 有人能给我一个具体的例子来说明如何使用它吗 非常感谢 虽然所有其他人总体上都是正确的 即 b是单词边界 b does表示字符类中的退格键 b 这确实会匹配退格字符 它只是一个可以出现在
  • Python正则表达式检查字符串是否包含任何单词

    我想搜索一个字符串并查看它是否包含以下任何单词 AB AG AS Ltd KB University 我在 javascript 中工作 var str Hello test AB var forbiddenwords new RegExp
  • 缺少嵌入互操作类型属性

    在一个 C 项目中 我收到以下警告 警告 CS1762 创建了对嵌入式互操作程序集 Interop SomeLibrary dll 的引用 因为间接引用了程序集 ALibraryOfMine dll 创建的该程序集 考虑更改任一程序集的 嵌
  • Zend RegEx Validator 的自定义有意义的错误消息

    我正在验证表单中的文本字段 如下所示 name new Zend Form Element Text name name gt setLabel First Name gt setRequired true gt addFilter new
  • 如何确保 re.findall() 停止在正确的位置?

    这是我的代码 a import re re findall r lt title gt lt title gt a 结果是 title aaa
  • 无法访问 GitLab:SSL 证书已过期

    在 Visual Studio 中 我尝试从 GitLab 上的存储库中提取一些更改 但它给了我一个错误 Git 因致命错误而失败 无法访问https gitlab git SSL证书问题 证书已过期 如何生成新证书并将其添加到 VS 中

随机推荐

  • JSON序列化时如何本地化?

    我已经奋斗了几个小时了 但没有好的结果 我正在尝试使用 NET JSON 序列化器将 JSON 从 UI 来回转换为对象 小数会出现问题 因为我的文化标准使用 作为小数分隔符而不是 我尝试过实现自定义转换器 请参阅this问题 没有好的结果
  • Fortran 符号不在加载表中(无法在 R 中调用加载的符号)

    我正在尝试使用 Absoft Pro Fortran 13 0 3 64 位 构建 Fortran DLL 以便在 Windows 7 64 位上的 R 中使用 这是我的文件 mycalc f 这是一个愚蠢的示例 只是为了测试功能 subr
  • debian docker 上的 GLIBC 不兼容

    我正在尝试构建一个以 rust rocksdb 作为依赖项的 Rust 应用程序 使用最新的 rust docker 映像进行编译 然后将二进制文件移动到 debian 这就是我的 Dockerfile 的样子 FROM rust 1 61
  • 我可以从批量插入中检索lastInsertId吗?

    INSERT INTO details idactivity user hours val date VALUES 981 133 0 10500 2008 07 01 981 184 0 2750 2008 07 01 981 184 0
  • 捕获所有无效子域的 nginx 服务器块

    我在一台主机上有多个域 nginx 管理所有这些域 每个域都有自己的 SSL 证书 我使用 webroot 插件从 certbot 获取该证书 我在每个配置文件的末尾都有一个服务器块 作为 包罗万象 来自here and here 对于无效
  • 使用点斜杠的最佳实践是什么?

    我在日志文件中看到大量与在锚标记的 href 属性上使用点斜杠 相关的错误 仅当点击来自 java 客户端时才会发生 HTML文档 a href myPage php Link to a dot slash file a 访问日志条目 my
  • 线程无法访问该对象

    我声明了一个字段 WriteableBitmap colorBitmap 然后我创建了一个简单的线程来执行某些操作 private void doSomething bla bla bla colorBitmap new Writeable
  • 谷歌地图多个信息窗口不起作用

    我尝试使用 javascript 将多个标记和信息窗口添加到谷歌地图 下面是代码
  • 在ansible中用多个值替换多个模式

    我在用regex replace在ansible中过滤 我可以让它工作 但它真的很麻烦 这就是我正在做的 set fact variable value regex replace 84 89 regex replace 76 78 reg
  • Javascript 对项目进行排序,排除某些特定项目

    我正在尝试对一些项目进行排序 对地图进行排序 我可以成功对其进行排序 但我想根据其属性排除一些项目 现在我根据属性 价格这样排序 return product attr active f sort function pA pB return
  • yii 模型搜索,带有时间戳的日期范围

    任何人都可以发布如何使用日期选择器过滤网格视图时间戳 Y m d h m s 列 我的模型如下 public function search criteria new CDbCriteria criteria gt condition ti
  • rmarkdown 中的变量作为标题

    In short 如何在 rmarkdown 中的块内打印 html header 使用变量在代码块内创建标头 In long 假设我的数据集中有许多变量 名称也存储在向量 Vars 中 并且每组 3 个变量属于同一主题 我可以创建一个循环
  • 在 XSLT 中使用 HTML 实体(例如 )

    在 XSLT 中包含 html 实体的最佳方式是什么
  • 求和值时返回 NaN 的对象

    我承认我在 JavaScript 和 JSON 方面很弱 我花了很多时间试图弄清楚为什么我的对象中的数字相加时会返回 NaN 考虑到这一点 下面是我的 JSON 存储到一个变量中 var data acc ext id null cat c
  • 'mov cx, [bp+6]' 使用什么寻址模式?

    mov cx bp 6 使用什么寻址模式 处理器是intel 8086 我正在学习Douglas V Hall 的 微处理器和接口 我知道它的内存寻址模式 但不确定它是基于寻址模式还是索引寻址模式 bp 6 是基于寻址模式 来自原始 808
  • laravel 4 关系 - 如何显示用户投票记录的前 5 名排名

    我正在创建一个新闻源系统 正如你很容易猜到的那样 这超出了我的能力范围 请善待我 让我走上正轨 或者提供一些我可以继续做的事情 我有数百个事件 模型名称为 Event1 表 事件 我还有一个数据透视表 用户可以在其中分配任何事件的重要性 值
  • 绑定到画布

    我的类中有一个 canvas 属性 我想知道是否可以将其绑定到 xaml 中的画布 数据绑定在画布中如何工作
  • 从http get请求中读取非英文字符

    我在从 http get 请求获取希伯来字符时遇到问题 我得到像这样的正方形字符 而不是希伯来字符 英文字符没问题 这是我的功能 public String executeHttpGet String urlString throws Ex
  • 为什么我的收集器方法不能并行处理数据?

    然而 假设此归约中使用的结果容器是一个并发可修改的集合 例如 ConcurrentHashMap 在这种情况下 累加器的并行调用实际上可以将它们的结果同时存入同一个共享结果容器中 从而消除了组合器合并不同结果容器的需要 这可能会提高并行执行
  • Visual Studio 正则表达式使用宏删除 VB.NET 代码中的所有注释和空行

    我试图在宏的帮助下删除文件中的所有注释和空行 现在我想出了这个解决方案 它删除了注释 下面描述了一些错误 但无法删除之间的空白行 Sub CleanCode Dim regexComment As String REM d D r n