正则表达式捕获 VBA 注释

2024-04-17

我正在尝试捕获 VBA 注释。到目前为止我有以下内容

'[^";]+\Z

它捕获以单引号开头但在字符串末尾之前不包含任何双引号的任何内容。即它不会匹配双引号字符串中的单引号。

dim s as string        ' a string variable   -- works
s = "the cat's hat"    ' quote within string -- works

但如果注释包含双引号字符串,则会失败

i.e.

dim s as string ' string should be set to "ten"

我怎样才能修复我的正则表达式来处理这个问题?


中的模式@Jeff Wurz 的评论 https://stackoverflow.com/questions/22044801/regex-to-capture-vba-comments?lq=1#comment33424910_22044801 (^\'[^\r\n]+$|''[^\r\n]+$) 甚至不匹配any你的测试样本,链接的问题是无用的,那里的正则表达式只会匹配OP问题中的具体评论,而不是“VBA 注释语法”。

您提出的正则表达式比我放弃正则表达式方法时的效果更好。

做得好!

问题是您无法使用正则表达式解析 VBA 注释。

In 词法分析器与解析器 https://stackoverflow.com/q/2842809/1188513, @SasQ 的回答 https://stackoverflow.com/a/3614928/1188513很好地解释了乔姆斯基的语法级别:

第三级:常规语法

他们使用常用表达,也就是说,它们只能由 字母表符号 (a,b),它们的串联 (ab,aba,bbb 等),或 替代方案(例如 a|b)。它们可以实现为有限状态 自动机 (FSA),如 NFA(非确定性有限自动机)或更好 DFA(确定性有限自动机)。常规语法无法处理 使用嵌套语法,例如正确嵌套/匹配的括号 (()()(()()))、嵌套 HTML/BBcode 标签、嵌套块等。这是因为 处理它的状态自动机应该有无限多个 状态来处理无限多个嵌套级别。

第 2 级:上下文无关语法

他们可以有语法中的嵌套、递归、自相似分支 树,因此它们可以很好地处理嵌套结构。他们可以 实现为带有堆栈的状态自动机。该堆栈用于 表示语法的嵌套级别。在实践中,他们是 通常作为自上而下的递归下降解析器实现,它使用 机器的过程调用堆栈来跟踪嵌套级别,并使用 为每个非终结符递归调用过程/函数 在他们的语法中。但他们无法处理上下文相关的 句法。例如。当你有一个表达式 x+3 并且在一个上下文中这个 x 可以是变量的名称,在其他上下文中它可以是名称 的函数等

第一级:上下文相关语法

正则表达式根本不是解决这个问题的合适工具,因为只要有多个单引号(/撇号),或者涉及双引号,您就需要确定代码行中最左边的撇号是否是在双引号内,如果是,那么您需要匹配双引号并找到结束双引号后最左边的撇号 - 实际上,最左边的撇号不是字符串文字的一部分,是您的注释标记。

我的理解是VBA注释语法是上下文相关语法(第 1 级),因为撇号只是您的标记(如果它不是字符串文字的一部分),并且要确定撇号是否是字符串文字的一部分,最简单的方法可能是从左到右遍历字符串并切换一些IsInsideQuote当您遇到双引号时进行标记...但前提是它们没有转义(双引号)。实际上,您甚至不检查字符串文字中是否有撇号:您只需继续行走,直到开放引号关闭,并且仅当“引号内标志”为False如果遇到单引号,则说明您找到了注释标记。

祝你好运!


这是您缺少的测试用例:

s = "abc'def ""xyz""'nutz!" 'string with apostrophes and escaped double quotes

如果您不关心捕获字符串文字,则可以简单地忽略转义的双引号并在此处查看 3 个字符串文字:"abc'def ", "xyz" and "'nutz!".


此 C# 代码输出'string with apostrophes and escaped double quotes(所有字符串内双引号都在代码中用反斜杠转义),并且适用于我给它的所有测试字符串:

    static void Main(string[] args)
    {
        var instruction = "s = \"abc'def \"\"xyz\"\"'nutz!\" 'string with apostrophes and escaped double quotes";
        // var instruction = "s = \"the cat's hat\"    ' quote within string -- works";
        // var instruction = "dim s as string ' string should be set to \"ten\"";

        int? commentStart = null;

        var isInsideQuotes = false;
        for (var i = 0; i < instruction.Length; i++)
        {
            if (instruction[i] == '"')
            {
                isInsideQuotes = !isInsideQuotes;
            }

            if (!isInsideQuotes && instruction[i] == '\'')
            {
                commentStart = i;
                break;
            }
        }

        if (commentStart.HasValue)
        {
            Console.WriteLine(instruction.Substring(commentStart.Value));
        }

        Console.ReadLine();
    }

那么如果你想捕捉所有法律意见,你需要处理遗留问题Rem关键字,并考虑行延续:

Rem this is a legal comment
' this _
    is also _
    a legal comment

换句话说,\r\n其本身不足以正确识别所有语句结束标记。

适当的词法分析器+解析器似乎是捕获所有评论的唯一方法。

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

正则表达式捕获 VBA 注释 的相关文章

  • PHP 正则表达式匹配字符串的最后一次出现

    我的字符串是 text1 A373R12345 我想找到该字符串最后出现的非数字数字 所以我使用这个正则表达式 0 9 然后我得到这个结果 1 A373 2 12345 但我的预期结果是 1 A373R 它有 R 2 12345 另一个例子
  • ORA-12728: 正则表达式中的范围无效

    我想检查表中是否插入了有效的电话号码 所以我的触发代码在这里 select start index into mob index from gmarg mobile operators where START INDEX substr ne
  • sed 错误“未终止的 's' 命令”故障排除

    我正在构建一个script https stackoverflow com questions 4036832 replacing a specific term in an xml file其中 它将用文件夹路径替换 XML 文件中的模式
  • Powershell 将单个字符串与多个正则表达式匹配?

    除了依次迭代每个正则表达式之外 是否有一种更 powershelly 的方式将单个字符串与正则表达式的数组 集合进行匹配 我真正想做的是这样的 database Name match includeRegexArray 考虑到 Powers
  • 使用自定义功能区时是否可以阻止 MS Access 自动更改选定的功能区选项卡?

    当使用自定义 UI XML 文件在 Access 中添加多个自定义功能区选项卡时 每当关闭窗体时 选定的功能区选项卡都会变回第一个自定义选项卡 我们从 VBA 以编程方式加载自定义功能区 我已经创建了重现问题的 accdb http sdr
  • Redim Preserve 给出“下标超出范围”

    我想要Redim Preserve一个数组我不断收到错误 下标超出范围 我知道只有最后一个维度的大小可以更改 这正是我正在做的事情 这里出了什么问题 数组的类型是Variant BmMatrix Sheets BENCH Range a60
  • 使用正则表达式搜索 Ruby 数组

    你好 我有一个小的 ruby 函数 它可以分割出一个 Ruby 数组 如下所示 def rearrange arr from to sidx arr index from eidx arr index to arr sidx arr sid
  • 正则表达式库基准

    我最近一直想知道正则表达式实现的性能 并且很难想出很多有用的信息 它很容易对浏览器 javascript 正则表达式性能进行基准测试 网上有很多工具 Chrome 和 Opera 中的 javascript 正则表达式实现几乎摧毁了所有其他
  • 如何通过保持目录结构完整来同步路径中匹配模式的文件?

    我想将所有文件从服务器 A 复制到服务器 B 这些文件在不同级别的文件系统层次结构中具有相同的父目录名称 例如 var lib data sub1 sub2 commonname filetobecopied foo var lib dat
  • 如何编写 Clojure 宏来从字符串创建正则表达式?

    我正在创建一个方便的宏 部分便利在于可以仅使用字符串来指定正则表达式 而不是使用 re 表示法 我无法弄清楚的一部分是如何让宏获取字符串并将其重写为 Clojure 正则表达式 例如 生成 re 符号 我认为这是一个语法 转义问题 我的第一
  • 如何使用正则表达式将字符串分成相同字符的组?

    我有一个这样的字符串 var string AAAAAAABBBCCCCCCDD 并喜欢将字符串分割成这种格式的数组 same characters gt same group 使用正则表达式 Array AAAAAAA BBB CCCCC
  • 返回条件格式化单元格内部颜色的函数

    我想要一个返回条件格式单元格颜色索引值的函数 它用于检查一行中的多个单元格 如果它们使用条件格式突出显示 则需要执行操作 检查单元格中是否有颜色比创建覆盖条件的组合条件公式更简单所有细胞的 或者说我是这么想的 尽管代码在消息框中有效 但下面
  • VBA / HTML / jQuery 选择自动完成 - 在列表中选择

    我正在尝试使用 Excel 中的 VBA 在网站的列表中选择一个值 这不是一个 正常列表 该网站使用 jQuery 选择自动完成 如下所示 example http davidwalsh name demo jquery chosen ph
  • JS用正则表达式替换数字

    我有元素的标识符 如下所示 form book 1 2 3 我想要的是用其他值替换该标识符中的第二个数字 我将函数 match 与以下正则表达式一起使用 var regexp d d d 但它返回我包含的数组 1 2 3 2 因此 当我尝试
  • 如何在 javascript 正则表达式中匹配平衡分隔符?

    我原以为这个问题是不可能的 据我所知 Javascript 的正则表达式既没有递归插值 也没有漂亮的 NET 平衡组功能 但问题就在那里 如问题 12 所示正则表达式 alf nu http regex alf nu 匹配平衡对 lt an
  • 如何修复日期过滤器 VBA,因为它没有拾取我范围内的所有日期

    我正在尝试创建一个过滤器来过滤掉我选择的日期内的所有日期 我选择的日期将始终反映整个月 例如 如果我需要 2019 年 5 月的数据 我将输入开始日期为 01 05 2019 结束日期为 31 05 2019 我的数据过滤器将需要选取经过我
  • 将用户定义的表类型从 VBA 传递到 SQL

    我的任务是创建一个 Excel 电子表格作为 SQL 数据库的前端 以及一些对数据执行复杂计算的 C 我的老板想要前端作为电子表格 而计算对于 VBA 来说似乎太复杂了 目前 检索数据集的存储过程运行良好 然后 用户将在 Excel 中编辑
  • 如何区分列表框中显示的文本和实际值?

    我有一个带有多选选项的列表框 我使用以下方式填充它addItem功能 我在 Google 上找不到任何有关此内容的文章 但我需要区分列表框中显示的文本和实际值 例如 shown hiddenvalue monday A1 tuesday A
  • 插入行而不选择任何内容?

    我正在使用 VBA 希望在特定位置插入一行而不选择它 我遇到的问题是 选择该行后 当脚本运行完毕时 电子表格会向下滚动到该行 我希望能够在不将电子表格向下滚动到插入行的情况下执行此操作 Rows i i Select ActiveCell
  • 正则表达式可以与 C++ 中的字符数组一起使用吗

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

随机推荐

  • 从类定义中省略“private”关键字是否会造成混淆?

    我最近删除了一个private从类定义中指定 因为它位于顶部 紧接在class关键词 class MyClass private int someVariable 我认为这是多余的 一位同事不同意这一点 称这实际上 隐藏 了private数
  • 加载linux内核的基地址

    我对内核如何加载到内存有一些疑问 检查后 proc kallsyms我能够找到内核中各种符号的地址 cat proc kallsyms head n 10 00000000 t vectors start 80008240 T asm do
  • SQL 数据类型 - 如何存储年份?

    我需要在数据库中插入年份 例如 1988 1990 等 当我使用日期或日期时间时 数据类型 它显示错误 我应该使用哪种数据类型 常规的 4 字节 INT 太大了 浪费空间 您没有说明您正在使用什么数据库 因此我无法推荐特定的数据类型 每个人
  • 如何在 d3 力定向图中突出显示(更改颜色)所有连接(邻居)节点和链接

    我在这里看到了这个例子http www d3noob org 2013 03 d3js force directed graph example basic html http www d3noob org 2013 03 d3js for
  • Kotlin 中的驱逐队列

    我需要一个集合 有固定的大小 是可变的 添加新元素后将重新索引元素 删除最旧的元素 如移位寄存器 我觉得番石榴EvictingQueue https guava dev releases 15 0 api docs com google c
  • 有没有办法将色调仅应用于seaborn中PairGrid的下部

    我想知道是否可以将色调仅应用于seaborn的下部PairGrid For example say I have the following figure 对于我需要展示的内容 我想将密度图保留在对角线上 将整体散点图保留在上部 在其上方打
  • 连接 Apollo 和 mongodb

    我想将我的 Apollo 服务器与我的 mongoDB 连接 我知道那里有很多例子 但我陷入了异步部分 没有找到解决方案或示例 这很奇怪 我完全错了吗 我从 next js 的示例开始https github com zeit next j
  • “窗口”类型不支持直接内容

    我有一个使用 VS 2015 构建的 WPF 解决方案 由多个项目组成 突然 我开始在设计模式下收到一条警告 内容如下 窗口 类型不支持直接内容 我了解某些控件不支持直接内容 但是System Windows Window应该 我收到同样的
  • Android 编程错误

    我正在使用 Eclipse Galileo 编写 Android 你好 测试 教程 http developer android com resources tutorials testing helloandroid test html
  • ASP.net 页面在导入语句上出现错误,但我确实有引用吗?

    任何想法为什么我在我的 MVC2 项目中收到以下错误 即使在项目本身中我肯定有对 system Web Entity 的引用 Compiler Error Message CS0234 The type or namespace name
  • 后台根据时间激活本地通知

    因此 我有一个包含重复间隔本地通知的应用程序 我想添加一个在睡眠期间暂停通知的功能 到目前为止 我已经为用户创建了两个日期选择器 以指定他们想要停止重复间隔的时间以及自动重新启动的时间 我还为他们添加了一个 uiswitch 来激活睡眠模式
  • 在 PHP 中将 Oauth 2.0 访问令牌传递给 Fusion Tables API 时出现无效凭据错误

    我已经达到了沮丧的地步 正在寻求帮助 我整个周末都在学习新东西 以便尝试弄清楚如何使用需要通过 Oauth 2 0 进行身份验证的 goolge fusion table API 我开始使用 php 进行开发只是因为我能够找到一些帮助我走上
  • 将事件处理程序应用于动态控制

    我有一个用户窗体 可以动态放置commandButton到用户表单上 但我似乎无法正确设置动态事件处理程序 下面显示了我如何设置动态按钮的代码 Set cButton Me Controls Add Forms CommandButton
  • 使 fetch 调用真正同步

    是的 我想完全同步 我知道它会完全停止我唯一的线程 但我真的需要它 因为我使用一些我不想更改的 SDK 并且在这个 SDK 中 您需要传递一个将被调用且会更改的函数那里有一些价值 比如 function onNonce stuff cons
  • 如何使用 Sql Server 2008 删除表中的前 1000 行?

    我在 SQL Server 中有一个表 我想从中删除前 1000 行 但是 我尝试了此操作 但我不是只删除前 1000 行 而是删除了表中的所有行 这是代码 delete from mytab select top 1000 a1 a2 a
  • 如何在AWS EC2服务器中编写cron作业

    我在 AWS EC2 中创建了一个 cron 作业 但它不起作用 我按照以下步骤创建 crontab 第1步 我登录到AWS EC2实例 step 2 crontab e 第三步 插入模式 第4步 我输入了 php var www html
  • 处理多种表单和打印内容[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 您好 我对
  • 从 JBPM WorkItemHandler 抛出异常?

    我对从 JBPM 工作项处理程序抛出异常以及在业务流程中的其他地方处理异常的主题有点困惑 我们使用 JBPM 6 0 3 在 Jboss EAP 6 1 中运行 The JBPM 用户指南 http docs jboss org jbpm
  • ExtJS TreeGrid 中的复选框列

    有没有办法在新的 extjs 小部件 TreeGrid 中包含复选框列 将节点属性标记为 false true 并不像 TreePanel 那样有效 Cheers 我修改了 Ext ux tree TreeGridNodeUI 类来实现此功
  • 正则表达式捕获 VBA 注释

    我正在尝试捕获 VBA 注释 到目前为止我有以下内容 Z 它捕获以单引号开头但在字符串末尾之前不包含任何双引号的任何内容 即它不会匹配双引号字符串中的单引号 dim s as string a string variable works s